TypeScript中void、never、any、unknown類型的區(qū)別小結
TypeScript 的類型系統(tǒng)通過 any、unknown、void、never 提供了靈活的類型控制能力。本文將解析它們的核心差異,并給出實際開發(fā)中的使用建議,幫助我們寫出更安全的代碼。
類型對比速查表
| 類型 | 可賦值給任意類型 | 任意值可賦值給它 | 類型安全 | 典型場景 |
|---|---|---|---|---|
| any | ?? 允許 | ?? 允許 | ? 不安全 | 舊代碼兼容、快速調試 |
| unknown | ? 禁止 | ?? 允許 | ?? 安全 | 安全接收外部數(shù)據(jù) |
| void | ? 禁止 | ? 禁止 | ?? 安全 | 無返回值的函數(shù) |
| never | ?? 允許 | ? 禁止 | ?? 安全 | 不可達代碼、類型收窄 |
void類型
void表示沒有任何類型,不能直接賦值。
let a: void; let b: number = a; // 報錯
給變量賦值為void是沒有意義的。
如果一個函數(shù)沒有返回值,此時我們可以定義為void
function fn():void {
console.log('今天天氣不錯')
}
<a href="javascript:void;" rel="external nofollow" ></a>never類型
never類型表示永不存在的值的類型。
// 拋出異常
function error(): never {
throw new Error('我是一個Error');
}
// 死循環(huán)
function loop(): never {
while (true) {
console.log('這里是死循環(huán)')
};
}any類型
any類型表示任意類型。
let num:number = 1000;
num = "jack" // 報錯
let num:any = 1000;
num = "jack" // 不報錯
// 調用方法,依然不報錯
num.setName('jack')雖然any不做任何約束,但是非常不推薦這樣使用,這樣會帶來隱患。
我們在開發(fā)組件、模塊、定義函數(shù)、調用接口時,如果類型很難定義出來、不知道屬于什么類型等場景,可以適當使用any類型。
unknown類型
unknown與any一樣,所有類型都可以分配給unknown,反之把unknown 賦值給其它類型會報錯。
// unknown 可以接收任意類型 let name:string = "jack" let user:unknown = name; // unknown 不可以賦值給其它類型,any除外,下面會報錯 let name:unknown = "jack" let user:string = name;
總結:
- 能確定類型的,盡量定義類型。
- 無法確定類型的,可以使用 any 進行兜底。
- 當函數(shù)沒有返回值時,可以使用void定義。
- any和unknown可以接收任意類型值,any可以賦值給任意類型,但unknown不可以賦值給任意類型。
void和any在項目中是比較常見的,never和unknown不常用。
常見疑問
Q:unknown 和 any 的區(qū)別?A:unknown 必須顯式類型檢查后才能使用,而 any 完全跳過類型安全。
Q:函數(shù)聲明返回 void 卻返回了值會怎樣?A:TypeScript 不會報錯,但這是邏輯矛盾,建議保持聲明與實際一致。
Q:什么時候必須用 never?A:當函數(shù)永遠不會正常返回時(如無限循環(huán)),或用于類型收窄的兜底檢查。
到此這篇關于TypeScript中void、never、any、unknown類型的區(qū)別小結的文章就介紹到這了,更多相關TypeScript void、never、any、unknown內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaScript檢測并限制復選框選中個數(shù)的方法
這篇文章主要介紹了JavaScript檢測并限制復選框選中個數(shù)的方法,涉及javascript針對復選框的判定與運算相關技巧,非常簡單實用,需要的朋友可以參考下2015-08-08

