跳至主要内容

任何

警告:不要将anymixed混淆。它也不同于empty.

如果你想找到一种方法来选择不使用类型检查器,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

  1. 当你正在将现有代码转换为使用Flow类型,并且目前无法进行代码类型检查(也许其他代码需要先进行转换)。
  2. 当你确信你的代码有效,但由于某种原因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