在 TS 裏簡單區分 any, unknown, never 的差別

any

任意類型。即不作任何約束,編譯時會跳過對其的類型檢查。

表現:

  1. 可以被任意值所賦值
  2. 可以賦值給任意定義
  3. 訪問一切這個變量下的屬性或者方法都不會做檢查而報錯。

如下列的代碼,均不對 test 變量做類型檢查。

// 1. 可以被任意值所賦值
let test: any
test = {}
test = 1
test = '123'
test = true

// 2. 可以賦值給任意定義
function add(num1: number, num2: number) {
  return num1 + num2
}
add(test, test)

// 3. 訪問一切這個變量下的屬性或者方法都不會做檢查而報錯。
test.a.b = 1

unknown

未知類型,即不知道會得到什麼樣的數據。TS 3.0 引入。

表現:

  1. 可以被任意值賦值
  2. 只能賦值給 any 和 unknown 類型的值
  3. 不允許執行變量的方法以及訪問內部屬性
// 1.
let test: unknown
test = {}
test = 1
test = '123'
test = true

// 2.
function add(num1: number, num2: number) {
  return num1 + num2
}
add(test, test) // 報錯: 類型“unknown”的參數不能賦給類型“number”的參數。ts(2345)

// 3.
test.a.b = 1 // 報錯: 對象的類型爲 "unknown"。ts(2571)

never

不存在值的類型。TS 2.0 引入。

通常情況下,一個變量被申明,若是沒有特別指定,也會被初始化爲 undefined 類型。這種類型就是特意用來標註這個變量,這個函數的返回沒有值的,見一個例子

function throwErr (msg: string): never {
  throw new Error(msg)
}

function generateErr(num: number): never {
  if (num > 1) {
    throw new Error()
  }
} // 報錯: 返回“從不”的函數不能具有可訪問的終結點。ts(2534)

如上的函數恆拋出錯誤,永遠不會有返回值,所以可以定義爲 never。而有條件能返回哪怕是 undefined 值的,也不能定義爲 never。

表現:

  1. 除了 never 類型外,其他類型均不能給 never 類型的定義賦值。
  2. never 是所有類型的子類型,可以給所有類型賦值,但前提是 tsconfig 裏開啓 "strictNullChecks": false
  3. 不允許執行變量的方法以及訪問內部屬性
// 1.
let test: never
test = {} // 報錯: 不能將類型“{}”分配給類型“never”。ts(2322)
test = 1 // 報錯: 不能將類型“{}”分配給類型“never”。ts(2322)
test = '123' // 報錯: 不能將類型“{}”分配給類型“never”。ts(2322)
test = true // 報錯: 不能將類型“{}”分配給類型“never”。ts(2322)

// 2.
function add(num1: number, num2: number) {
  return num1 + num2
}
add(test, test)

// 3.
test.a.b = 1 // 報錯: 類型“never”上不存在屬性“a”。ts(2339)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章