任何
如果你想找到一种方法来选择不使用类型检查器,any
就是你的选择。使用any
完全不安全,应尽可能避免。
例如,以下代码不会报告任何错误
1function add(one: any, two: any): number {2 return one + two;3}4
5add(1, 2); // Works.6add("1", "2"); // Works.7add({}, []); // Works.
即使会导致运行时错误的代码也不会被Flow捕获
1function getNestedProperty(obj: any) {2 return obj.foo.bar.baz;3}4
5getNestedProperty({});
只有几种情况下你可能会考虑使用any
- 当你正在将现有代码转换为使用Flow类型,并且目前无法进行代码类型检查(也许其他代码需要先进行转换)。
- 当你确信你的代码有效,但由于某种原因Flow无法正确地进行类型检查。JavaScript中存在一些(正在减少的)习语,Flow无法静态地对其进行类型检查。
你可以通过启用unclear-type
代码风格检查规则来禁止any
。
你可以使用coverage命令来识别被类型化为any
的代码。
避免泄漏any
当你有一个类型为any
的值时,你可以让Flow推断你执行的所有操作的结果为any
。
例如,如果你获取类型为any
的对象上的属性,则结果值也将具有类型any
。
1function fn(obj: any) {2 let foo = obj.foo; // Results in `any` type3}
然后,你可以在另一个操作中使用结果值,例如将其添加为数字,结果也将为any
。
1function fn(obj: any) {2 let foo = obj.foo; // Results in `any` type3 let bar = foo * 2; // Results in `any` type4}
你可以继续这个过程,直到any
泄漏到你的整个代码中。
1function fn(obj: any) {2 let foo = obj.foo;3 let bar = foo * 2;4 return bar; // Results in `any` type5}6
7let bar = fn({ foo: 2 }); // Results in `any` type8let baz = "baz:" + bar; // Results in `any` type
通过尽快将其转换为另一种类型来切断any
,以防止这种情况发生。
1function fn(obj: any) {2 let foo: number = obj.foo;3}
现在你的代码将不会泄漏any
。