為了解決any型別的汙染問題,引入了unkown型別、它與any型別的相似之處在於,所有型別的值都可以分配給unkown型別。
let x:unknown; x = true; // 正確 x = 42; // 正確 x = 'Hello World' // 正確
它們的不同之處在於:
1、unknown型別的變數,不能直接賦值給其它型別的變數(除了any型別和unknown型別)
let v:unknown = 123; let v1:boolean = v // 報錯 let v2:number = v // 報錯
2. unkown型別的變數不能直接呼叫方法和屬性
let v1:unknown = {foo:1} v1.foo // 報錯 let v2:unknown = 'hello' v2.trim() // 報錯 let v3:unknown = (n=0)=>n+1 v3() // 報錯
如上,連直接當做函式執行也不行。
。。既然這樣,那unknown的作用是什麼呢?就是為了替代any型別,或者或,更嚴格的any型別。意思就是宣告的變數可以是任何型別。但是又不能呼叫方法和屬性,感覺沒啥用。
遷移舊的專案,或者哪個變數想暫時關閉型別檢查都可以用。
3. unknown型別變數能夠進行的運算是有限的。加減乘除這些都不能進行。
let a:unknown = 1; a + 1 // 報錯 a === 1 // 正確
想要進行這些運算只有經過‘型別縮小’才可以
let a:unknown = 1; if (typeof a === 'number') { let r = a + 10; // 正確 }
let s:unknown = 'hello'; if (typeof s === 'string') { s.length; // 經過型別縮小後,也可以使用字串的方法了 }
二、never型別
never型別也稱為“空型別”,及不包含任何值
let x:never;
給never型別的變數,賦給它任何值都會報錯。
它的使用場景:
1. 在型別運算中,保證型別的完整性
2.不可能返回值的函式,返回值的型別就可以寫成never。
never型別的一個重要特點是可以賦值給任意其他型別
let x:never; let x1:string = x // 不報錯 let x2:number = x // 不報錯 let x3:boolean = x // 不報錯
為什麼never型別可以賦值給任意其他型別呢?這跟集合論有關,空集是任何集合的子集。TS規定,任何型別都包含了never型別
總之,TS有兩個“頂層型別”(any和unknown),但是“底層型別”只有never唯一一個。
any 型別,unknown 型別,never 型別 - TypeScript 教程 - 網道 (wangdoc.com)