2015-04-05 71 views
0

我有一個函數類型在string和函數類型之間的聯合類型。我怎樣才能寫出一個縮小到那個函數類型的類型? (以下是行不通的。)函數類型的類型保護

interface Callback { 
    (args: any[]): void 
} 

var fn = function(arg: string | Callback) { 
    if (typeof arg == 'Callback') { 
     arg.call([]); 
    } 
} 
+1

的'typeof'操作** **從未'回報'Callback''。它總是返回「函數」,「字符串」,「數字」,「布爾」,「對象」或「未定義」之一。 – 2015-04-06 01:33:05

回答

2

typeof永遠不會返回'Callback'。在這種情況下,將工作做一個instanceof Function檢查:

interface Callback { 
    (args: any[]): void 
} 

var fn = function(arg: string | Callback) { 
    if (arg instanceof Function) { 
     arg.call([]); 
    } 
}; 

或者這也適用:

if (typeof arg === "function") { 
    arg.call([]); 
} 
+0

與'typeof arg ==='string''不同,使用'typeof arg ==='function''不會導致TypeScript將'arg'識別爲一個函數,因此是'call'上的編譯錯誤。 – 2015-04-06 15:10:31

+0

@ZevSpitz這很奇怪......我沒有這個問題。 [見這裏](http://goo.gl/6LQ4li)arg如何被識別爲'Callback'。 – 2015-04-06 15:27:37

+0

@DavidSherret奇怪的是,如果添加一個'else {arg + =「foo」; }',它不再正常工作。 – JKillian 2016-02-27 05:07:05