Javascript静态类型检测器Flow任意类型(Any Types)介绍

266 1 年前
any: 相当于不检查。在某一些情况可能不需要定义的太过于严格,或是还在开发中正在调试时,有一种作为渐进的改善代码的类型。any是让Flow跳过这里的类型检测。

(Any Types)

使用any跳出类型系统,注意,不要误解mixedany

如果你想一种方法来跳出使用类型检测器,any可以做到这一点。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不能正确检测类型时。Flow无法静态化类Javascript中一些惯用语。

避免泄漏any

(Avoid leaking any)

当你有一个类型为any的值时,你可能会导致Flow推断你所执行操作的所有结果也是any类型。

例如,如果你读取一个类型为any的对象的属性,结果值也是一个any类型。

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

你可以稍后在其他操作中使用这个结果,比如如果这是一个数值把它加起来,这样结果也将是any类型。

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

你可以继续这个过程直到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) {
  let foo: number = obj.foo;
}

现在你的代码不会泄漏 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;

更多信息,请访问 任意类型

分类栏目
© 2018邮箱:11407215#qq.comGitHub沪ICP备12039518号-6