number) {
return '' + value;
}
你可以像java 的泛型一样(有区别)去标明一个类型,下面的例子 标明,该函数返回的类型跟传进函数的类型相同.
function identity<T>(value: T): T {
return value;
}你可以这样来 标记 一个函数可以接受任何类型的参数
function getTypeOf(value: mixed): string {
return typeof value;
}当你使用 mixed 时候, 虽然你可以传进任何类型, 但是你返回的时候 必须要明确他是什么类型, 不然就报错
// @flow
function stringify(value: mixed) {
// $ExpectError
return "" + value; // Error!
}
stringify("foo");任何类型(any type)
不要搞混any 和mixed, 如果你想跳过类型检查,那你就用 any 吧
// @flow
function add(one: any, two: any): number {
return one + two;
}
add(1, 2); // Works.
add("1", "2"); // Works.
add({}, []); // Works.只要两种情况,可以使用 any
旧代码 新增flow 类型检查,并且 用其他类型的会引起大量错误
当你明确的知道你的代码不能通过类型检查的时候,
避免泄漏any
当你声明了 传进的参数的any的时候,那么你返回的参数也都是any , 避免这种情况, 需要切断 它
// @flow
function fn(obj: any) /* (:number) */ {
let foo: number = obj.foo; // 这句才是重点, 切断 any
let bar /* (:number) */ = foo * 2;
return bar;
}
let bar /* (:number) */ = fn({ foo: 2 });
let baz /* (:string) */ = "baz:" + bar;可能类型 (maybe type)
就是上面提到的 可以用 ? 问号标记他是可选的类型
变量类型 (variable type)
在flow 分为两组, 一组是 let 和 var 可以再次赋值, 另一组是const 不能再次赋值
const
const 可以注入你赋值的类型, 或者你自己手动的指定类型
// @flow
const foo /* : number */ = 1;
const bar: number = 2;let 和 var
跟上面一样, 这两个也可以自动的注入类型
但是 若你自动注入的类型, 你重新赋值修改的类型的时候并不会得到报错
如果语句,函数,和其他的条件代码,可以精确的指出他是什么类型,那么就可以避免flow 的检查 不然就报错
// @flow
let foo = 42;
function mutate() {
foo = true;
foo = "hello";
}
mutate();
// $ExpectError
let isString: string = foo; // Error!尽量避免上面的用法(个人推荐)
函数类型(function type)
函数只有两种用法, 要么参数, 要么返回值
// @flow
function concat(a: string, b: string): string {
return a + b;
}
concat("foo", "bar"); // Works!
// $ExpectError
concat(true, false); // Error!声明函数
同上
箭头函数
(str: string, bool?: boolean, ...nums: Array<number>) => void带回调的箭头函数
function method(callback: (error: Error 关键词:javascript静态分类如何解析flow的用法(详细)