2015-08-25 44 views
0

我已經在TypeScript中定義了一個類型Filter,它可以是string,RegExpPredicator,這是一個函數。類型定義如下。TypeScript中的函數類型警衛

export type Predicator = (input: string) => boolean; 
export type SingleFilter = string | RegExp | Predicator; 

有一個函數以SingleFilter作爲輸入。但是,只要RegExp主張,類型警衛似乎不能與Predicator一起工作。 但是,如果僅僅是string | Predicator,問題就消失了。

function singlePredicator(value: any) { 
    if (typeof value === 'string') { 
    // do something for string 
    } 
    else if (value instanceof RegExp) { 
    // do something 
    } 
    else { 
    // do something for function 
    // Error TS2349: Cannot invoke an expression whose type lacks a call signature. 
    value(foo); 
    } 
} 

是否有任何解決方案,使其在我的情況下工作?謝謝。我正在使用tsc 1.5.3

回答

1

以下示例中的第一項更改是,我輸入了value參數SingleFilter而不是「any」。

第二個變化是最後else語句中的類型斷言,以暗示編譯器valuePredicator

export type Predicator = (input: string) => boolean; 
export type SingleFilter = string | RegExp | Predicator; 

function singlePredicator(value: SingleFilter) { 
    if (typeof value === 'string') { 
    // do something for string 
    return value.charAt(0); 
    } else if (value instanceof RegExp) { 
    // do something 
    value.test("Something"); 
    } else { 
    // do something for function 
    var foo = "SomeFoo"; 
    value(foo); 
    } 
} 
+0

非常感謝,它現在有效。但是,仍然有什麼辦法讓職業警衛在職能上工作? – Haocheng

+0

如果你有一個聯合類型的'string | Function',它會按預期工作。 http://bit.ly/1NAKB3B - 同樣適用於'string | number | Function',所以問題源於RegExp的instanceof檢查。 – Fenton

+0

謝謝,這對我的情況是有意義的:) – Haocheng