任意类型(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;