Flow任意类型(Any Types)

2018-01-25  本文已影响0人  vincent_z

任意类型(Any Types)

任意类型any使你可以避免类型检查。但这样做并不提倡,因为不安全。
例如,下面的代码不会报告任何错误:

// @flow
function add(one: any, two: any): number {
  return one + two;
}

add(1, 2);     // Works.
add("1", "2"); // Works.
add({}, []);   // Works.

即使是会导致运行时错误的代码也不会被Flow捕获:

// @flow
function getNestedProperty(obj: any) {
  return obj.foo.bar.baz;
}

getNestedProperty({});

只有几种情况可以考虑使用any

  • 你正在将现有代码转换为使用Flow类型检查的过程中,并且当前已阻止检查代码类型检查(你可能想先转换其他代码)。
  • 你确定你的代码正常工作,但是由于某些原因,Flow无法正确工作。

避免泄露any

当你定义一个值类型为any时,Flow会把与该值相关的所有操作的结果都推导成any类型。

// @flow
function fn(obj: any) /* (:any) */ {
  let foo /* (:any) */ = obj.foo;
  let bar /* (:any) */ = foo * 2;
  return bar;
}

let bar /* (:any) */ = fn({ foo: 2 });
let baz /* (:any) */ = "baz:" + bar;

阻止这种情况发生的手段是尽可能早地摒弃any

// @flow
function fn(obj: any) /* (:number) */ {
  let foo: number = obj.foo;
  let bar /* (:number) */ = foo * 2;
  return bar;
}

let bar /* (:number) */ = fn({ foo: 2 });
let baz /* (:string) */ = "baz:" + bar;
上一篇 下一篇

猜你喜欢

热点阅读