TS學習筆記(二)

飞向火星發表於2024-10-03

為了解決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)

相關文章