any
任意類型。即不作任何約束,編譯時會跳過對其的類型檢查。
表現:
- 可以被任意值所賦值
- 可以賦值給任意定義
- 訪問一切這個變量下的屬性或者方法都不會做檢查而報錯。
如下列的代碼,均不對 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 引入。
表現:
- 可以被任意值賦值
- 只能賦值給 any 和 unknown 類型的值
- 不允許執行變量的方法以及訪問內部屬性
// 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。
表現:
- 除了 never 類型外,其他類型均不能給 never 類型的定義賦值。
- never 是所有類型的子類型,可以給所有類型賦值,但前提是 tsconfig 裏開啓
"strictNullChecks": false
- 不允許執行變量的方法以及訪問內部屬性
// 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)