我知道一般的解釋是編譯器會進行靜態類型檢查,但編譯器使用什麼方法來驗證沒有可空類型意外地發揮作用?Typescript 2如何執行非空類型?
回答
TypeScript完全是編譯端;所有靜態類型在轉換爲JavaScript時都會丟失。儘管沒有理由做這樣的事情阻止你:
let foo: { myProperty: string } = { myProperty: "g" }; // myProperty is non-nullable
foo["myProperty"] = undefined; // bypass type checker!
爲空性/ undefinedness檢查只是在如何式系統模型類型的變化。像往常一樣,這一切都發生在類型檢查階段,並且在發射的JavaScript中沒有任何東西在運行時強制執行。
無論如何,你可以將類型想象爲域的值。例如,boolean
的域通常只是兩個值true
和false
。 string
是一個無界域,其中包含字符串"hello"
和"world"
以及其他所有字符串。
TypeScript檢查在某個類型位置使用某個值時,該值位於該類型的域中。例如,true
不在number
的域名,所以嘗試使用true
是非法的,其中number
是預期的。
在打字稿沒有嚴格的空檢查,null
和undefined
在每一個類型的領域。所以boolean
型實際上有四個值:true
,false
,undefined
和null
。正如人們通常發現的那樣,這很糟糕,因爲undefined
和null
的行爲並不完全像true
和false
。對於具有屬性和方法的東西,情況更糟,因爲substr
作爲string
域中每個值的方法存在,除了null
和undefined
,所以它真的很煩人。
在打字稿與嚴格的空檢查,null
和undefined
搬出所有類型的域,並轉化爲自己的類型。現在,價值null
不能用於string
預期的地方,因爲它不再位於string
的域中。 string | null
現在代表的值可能是string
域或的某些成員的特殊值null
。
這個解釋是從Anders Hejlsberg's talk from Build 2016 starting around 44:30改編而來的,正如你可能想象的那樣,他比我更擅長解釋它,尤其是因爲他有一些很好的幻燈片陪伴它。
- 1. 如何爲TypeScript類執行Joi驗證?
- 2. Angular2,TypeScript,Ionic 2代碼執行順序
- 3. 如何在TypeScript 2項目中安裝Firebase 3的類型?
- 4. TypeScript類型的類型
- 5. 非空類型'System.DateTime',ASP.NET MVC
- 6. 執行類型
- 7. 如何在Kotlin中執行一個空的非空字符串?
- 8. TypeScript使用相同類型的全局類型名稱空間
- 9. 如何在C++/CLI中將非空類型轉換爲可空?
- 10. 如何將空值賦給C#中的非空類型變量?
- 11. 如何爲非ActiveRecord支持的類執行自動類型轉換?
- 12. 如何在Typescript中自反泛型類?
- 13. 如何判斷TypeScript對象的類型?
- 14. 原型和TypeScript Angular 2
- 15. 無論異常類型如何執行
- 16. 如何執行類型轉換?
- 17. 抽象類和非空值類型
- 18. Typescript日期類型?
- 19. 如何在typescript 2中指定具有類型註釋的派生類?
- 20. 爲空的類型入門類型定義打破了非可空類型
- 21. 如何區分對象類型與Typescript中的數組類型
- 22. Angular 2 Typescript類屬性允許分配不正確的類型
- 23. 使用Typescript返回空白或任何其他類型
- 24. 「參數字典包含非空參數的非空類型」?
- 25. 如何使用JNI爲非可執行JAR設置堆空間
- 26. 如何將非名稱空間類型導入IronPython?
- 27. 如何解決「類型錯誤#2007參數子必須非空」?
- 28. 如何在C#中使非值類型爲空?
- 29. 在C#中創建非空值類型#
- 30. 如何使用TypeScript在我的Angular 2組件中聲明模型類?
這是正確的,但該代碼拋出一個編譯錯誤嚴格空檢查雖然 - 「類型未定義不可分配給類型字符串。」它不會繞過類型檢查器。 –