User-defined type guards和instanceof
type guards不窄類型是any
(包括union和intersection類型的any
)。
,將在型保護縮小的any
唯一使用typeof
檢查和檢查原始string
,bool
,和number
:
var something: any;
if (typeof something === "string")
{
something.NonExistant(); // <- Error, does not exist on `string`
something.substr(0, 10); // <- Ok
}
的其它通用的typeof值,function
,object
和undefined
,不縮小any
如果有人試圖像上面的例子那樣使用它們。
還有一個open issue,可以將any
縮小到用戶定義的類型警衛中的基元,並在TS 2.0上達到里程碑。
這是一種有意識的design decision而不是一個錯誤
的主要動機似乎是這種類型,守着一個類型通常縮小可能的類型,我們可以訪問更多的屬性,我們可以肯定的存在於選中的上下文中。但是在類型守護專用any
的情況下,我們已經可以訪問所有可能存在的成員,因此在您的示例中使用any
進行類型守護實際上會限制我們。
另一個動機似乎也有too much crappy code那裏會打破如果TypeScript縮小any
的就像其他類型。
解決方法
如果你有一個變量,它可以是任意類的實例,使用類型Object
,而不是any
和預期型防護會工作。