Facebook 流函数联合类型
Facebook Flow Function Union Type
我在玩 Facebook Flow,想知道为什么下面的函数没有类型检查?它显然使用了一个由“|”表示的联合类型。
declare var f: ((x: any) => number) | ((x: any) => string);
function f(x) {
if(true) {
return 5;
}
else return 'hello';
}
检查员抱怨:
function
This type is incompatible with
union type
我知道当我注释它时它会起作用:
declare var f: (x: any) => number|string;
但是为什么之前的注解会失效呢?坦率地说,到目前为止,我还没有在任何地方看到函数类型的联合类型,但是,我没有看到为什么它不应该被允许的理论上的原因。
((x: any) => number) | ((x: any) => string)
是一个有效的表达式。这意味着 f
可以是这两个 函数签名 之一。例如
f = function(x: any): number {return 0}
会起作用
f = function(x: any): string {return 'hello'}
也可以
(x: any) => number|string
表示同一个函数的return值动态可以是这些类型中的一种,这里就是这样。
我在玩 Facebook Flow,想知道为什么下面的函数没有类型检查?它显然使用了一个由“|”表示的联合类型。
declare var f: ((x: any) => number) | ((x: any) => string);
function f(x) {
if(true) {
return 5;
}
else return 'hello';
}
检查员抱怨:
function
This type is incompatible with
union type
我知道当我注释它时它会起作用:
declare var f: (x: any) => number|string;
但是为什么之前的注解会失效呢?坦率地说,到目前为止,我还没有在任何地方看到函数类型的联合类型,但是,我没有看到为什么它不应该被允许的理论上的原因。
((x: any) => number) | ((x: any) => string)
是一个有效的表达式。这意味着 f
可以是这两个 函数签名 之一。例如
f = function(x: any): number {return 0}
会起作用
f = function(x: any): string {return 'hello'}
也可以
(x: any) => number|string
表示同一个函数的return值动态可以是这些类型中的一种,这里就是这样。