2015-07-01 69 views
1

我正在玩Facebook流和奇怪,爲什麼以下功能不打字檢查?它顯然使用由'|'表示的聯合類型。Facebook流量功能聯盟類型

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; 

但爲什麼前者批註失敗?坦率地說,到目前爲止,我還沒有看到函數類型的聯合類型,但是我沒有看到它不應該被允許的理論原因。

回答

1

((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裝置相同功能的返回值可以是這些類型的動態中的一個,其在這裏是這樣的。