2016-09-23 154 views

回答

0

TypeScript完全是編譯端;所有靜態類型在轉換爲JavaScript時都會丟失。儘管沒有理由做這樣的事情阻止你:

let foo: { myProperty: string } = { myProperty: "g" }; // myProperty is non-nullable 

foo["myProperty"] = undefined; // bypass type checker! 
+3

這是正確的,但該代碼拋出一個編譯錯誤嚴格空檢查雖然 - 「類型未定義不可分配給類型字符串。」它不會繞過類型檢查器。 –

6

爲空性/ undefinedness檢查只是在如何式系統模型類型的變化。像往常一樣,這一切都發生在類型檢查階段,並且在發射的JavaScript中沒有任何東西在運行時強制執行。

無論如何,你可以將類型想象爲域的值。例如,boolean的域通常只是兩個值truefalsestring是一個無界域,其中包含字符串"hello""world"以及其他所有字符串。

TypeScript檢查在某個類型位置使用某個值時,該值位於該類型的域中。例如,true不在number的域名,所以嘗試使用true是非法的,其中number是預期的。

在打字稿沒有嚴格的空檢查,nullundefined在每一個類型的領域。所以boolean型實際上有四個值:true,false,undefinednull。正如人們通常發現的那樣,這很糟糕,因爲undefinednull的行爲並不完全像truefalse。對於具有屬性和方法的東西,情況更糟,因爲substr作爲string域中每個值的方法存在,除了nullundefined,所以它真的很煩人。

在打字稿嚴格的空檢查,nullundefined搬出所有類型的域,並轉化爲自己的類型。現在,價值null不能用於string預期的地方,因爲它不再位於string的域中。 string | null現在代表的值可能是string的某些成員的特殊值null

這個解釋是從Anders Hejlsberg's talk from Build 2016 starting around 44:30改編而來的,正如你可能想象的那樣,他比我更擅長解釋它,尤其是因爲他有一些很好的幻燈片陪伴它。

相關問題