我有一個函數類型在string
和函數類型之間的聯合類型。我怎樣才能寫出一個縮小到那個函數類型的類型? (以下是行不通的。)函數類型的類型保護
interface Callback {
(args: any[]): void
}
var fn = function(arg: string | Callback) {
if (typeof arg == 'Callback') {
arg.call([]);
}
}
我有一個函數類型在string
和函數類型之間的聯合類型。我怎樣才能寫出一個縮小到那個函數類型的類型? (以下是行不通的。)函數類型的類型保護
interface Callback {
(args: any[]): void
}
var fn = function(arg: string | Callback) {
if (typeof arg == 'Callback') {
arg.call([]);
}
}
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([]);
}
與'typeof arg ==='string''不同,使用'typeof arg ==='function''不會導致TypeScript將'arg'識別爲一個函數,因此是'call'上的編譯錯誤。 – 2015-04-06 15:10:31
@ZevSpitz這很奇怪......我沒有這個問題。 [見這裏](http://goo.gl/6LQ4li)arg如何被識別爲'Callback'。 – 2015-04-06 15:27:37
@DavidSherret奇怪的是,如果添加一個'else {arg + =「foo」; }',它不再正常工作。 – JKillian 2016-02-27 05:07:05
的'typeof'操作** **從未'回報'Callback''。它總是返回「函數」,「字符串」,「數字」,「布爾」,「對象」或「未定義」之一。 – 2015-04-06 01:33:05