Ⅰ ts類型斷言(二)
一、將任何一個類型斷言為any
ts 的類型系統運轉良好,每個值類型都具體而精確。當我們引用一個在此類型 上不存在的屬性或方法時,就會報錯:
上面的例子中,數字類型的變數 num 是沒有length 屬性的,故ts給出了相應的錯誤提示。
但有的時候,我們非常確定這段代碼不會出錯,比如下面這個例子:
上面的例子中,我們需要將window.上添加一個屬性 num,但ts編譯時會報錯,提示我們window上不存在nun屬性。 此時我們可以使用 as any 臨時將 window 斷言為 any 類型
在any類型的變數上,訪問任何屬性都是允許的。
注意 :將一個變數斷言為any可以說是解決ts中類型問題的最後一個手段。 它極有可能掩蓋了真正的類型錯誤。 如果不是非常確定,就不要使用 as any
我們不能濫用 as any , 也不要否定它的作用
二、將any斷言為一個具體的類型
在開發中,我們不可避免需要處理any類型的變數,它們可能是由於第三方庫未能定義好自己的類型,也有可能是 歷史 遺留的或其他人編寫的爛代碼,還可能是受到ts類型系統的限制而無法精確定義類型的場景。
遇到any類型的變數時,我們可以選擇無視它,任由它滋生更多的any。
我們也可以選擇改進它,通過類型斷言及時把any斷言為精確的類型,亡羊補牢,使我們的代碼向著高可維護性的目標發展。
例如項目之前定義了一個 getCalander,它的返回值是any:
那麼我們在使用它時,最好能夠將調用了它之後的返回值斷言成一個精確的類型, 這樣就方便了後續的操作:
選擇語言
上面的例子中,我們調用完getCalander之後,將它斷言為CalanderType類型,從而明確getCurrentDate的類型,後續對getCurrentDate的訪問時就有了代碼補全,提高承俄碼以可維護性。
三、類型斷言的限制
根據之前的例子,我們可以得出:
1、聯合類型可以被斷言為其中一個類型
2、父類可以被斷言為子類
3、任何類型都可以被斷言為any
4、 any 可以被斷言為任何類型
那麼類型斷言有沒有什麼限制呢?是不是任何一個類型都可以被斷言為任何另一個類型呢?
其實並不是任何一個類型都可以被斷言為任何另一個類型。
具體來說,若A兼容B,那麼A能夠被斷言為B,B也能被斷言為A。
下面我們通過一個簡化的例子,來理解類型斷言的限制:
上例是可以斷言的,我們再看看下面的栗子:
這個時候會提示錯誤,兩者不能充分重疊,這意味要想斷言成功,還必須具備有一個條件:
即:要使得A能夠被斷言為B,只需要A兼容B或B兼容A即可
四、雙重斷言(不建議使用)
」任何類型都可以被斷言為any , any 可以被斷言為任何類型
那麼我們是不是可以使用雙重斷言 xxx as any as xxx 將任何一個類型斷言為任何另一個類型呢?
在上面的例子中,若直接使用mySelf as Fish肯定會報錯,因為mySelf 和Fish 互相都不兼容。
若使用雙重斷言,則可以打破「要使得A能夠被斷言為B,只需要A兼容B或B兼容A即可」的限制,將任何一個類型斷言為任何另一個類型到若你使用了這種雙重斷言,那麼十有八九是非常錯誤的,它很可能會導致運行時錯誤。
Ⅱ html使用ts
在運行html時要寬兆先編譯一下ts文件
TypeScript 只會在編譯時對類搏巧型型進行靜態檢查,如果發現有錯誤,編譯的時候就會報錯。而在運行時,與普通的 JavaScript 文基猜件一樣,不會對類型進行檢查。