2016-04-29 89 views

回答

3

User-defined type guardsinstanceof type guards不窄類型是any(包括unionintersection類型的any)。

,將在型保護縮小的any唯一使用typeof檢查和檢查原始stringbool,和number

var something: any; 
if (typeof something === "string") 
{ 
    something.NonExistant(); // <- Error, does not exist on `string` 
    something.substr(0, 10); // <- Ok 
} 

的其它通用的typeof值,functionobjectundefined,不縮小any如果有人試圖像上面的例子那樣使用它們。

還有一個open issue,可以將any縮小到用戶定義的類型警衛中的基元,並在TS 2.0上達到里程碑。

這是一種有意識的design decision而不是一個錯誤

的主要動機似乎是這種類型,守着一個類型通常縮小可能的類型,我們可以訪問更多的屬性,我們可以肯定的存在於選中的上下文中。但是在類型守護專用any的情況下,我們已經可以訪問所有可能存在的成員,因此在您的示例中使用any進行類型守護實際上會限制我們。

另一個動機似乎也有too much crappy code那裏會打破如果TypeScript縮小any的就像其他類型。

解決方法

如果你有一個變量,它可以是任意類的實例,使用類型Object,而不是any和預期型防護會工作。