TypeScript中void、never、any、unknown類型的區(qū)別小結(jié)
TypeScript 的類型系統(tǒng)通過 any、unknown、void、never 提供了靈活的類型控制能力。本文將解析它們的核心差異,并給出實(shí)際開發(fā)中的使用建議,幫助我們寫出更安全的代碼。
類型對(duì)比速查表
| 類型 | 可賦值給任意類型 | 任意值可賦值給它 | 類型安全 | 典型場(chǎng)景 |
|---|---|---|---|---|
| any | ?? 允許 | ?? 允許 | ? 不安全 | 舊代碼兼容、快速調(diào)試 |
| unknown | ? 禁止 | ?? 允許 | ?? 安全 | 安全接收外部數(shù)據(jù) |
| void | ? 禁止 | ? 禁止 | ?? 安全 | 無返回值的函數(shù) |
| never | ?? 允許 | ? 禁止 | ?? 安全 | 不可達(dá)代碼、類型收窄 |
void類型
void表示沒有任何類型,不能直接賦值。
let a: void; let b: number = a; // 報(bào)錯(cuò)
給變量賦值為void是沒有意義的。
如果一個(gè)函數(shù)沒有返回值,此時(shí)我們可以定義為void
function fn():void {
console.log('今天天氣不錯(cuò)')
}
<a href="javascript:void;" rel="external nofollow" ></a>never類型
never類型表示永不存在的值的類型。
// 拋出異常
function error(): never {
throw new Error('我是一個(gè)Error');
}
// 死循環(huán)
function loop(): never {
while (true) {
console.log('這里是死循環(huán)')
};
}any類型
any類型表示任意類型。
let num:number = 1000;
num = "jack" // 報(bào)錯(cuò)
let num:any = 1000;
num = "jack" // 不報(bào)錯(cuò)
// 調(diào)用方法,依然不報(bào)錯(cuò)
num.setName('jack')雖然any不做任何約束,但是非常不推薦這樣使用,這樣會(huì)帶來隱患。
我們?cè)陂_發(fā)組件、模塊、定義函數(shù)、調(diào)用接口時(shí),如果類型很難定義出來、不知道屬于什么類型等場(chǎng)景,可以適當(dāng)使用any類型。
unknown類型
unknown與any一樣,所有類型都可以分配給unknown,反之把unknown 賦值給其它類型會(huì)報(bào)錯(cuò)。
// unknown 可以接收任意類型 let name:string = "jack" let user:unknown = name; // unknown 不可以賦值給其它類型,any除外,下面會(huì)報(bào)錯(cuò) let name:unknown = "jack" let user:string = name;
總結(jié):
- 能確定類型的,盡量定義類型。
- 無法確定類型的,可以使用 any 進(jìn)行兜底。
- 當(dāng)函數(shù)沒有返回值時(shí),可以使用void定義。
- any和unknown可以接收任意類型值,any可以賦值給任意類型,但unknown不可以賦值給任意類型。
void和any在項(xiàng)目中是比較常見的,never和unknown不常用。
常見疑問
Q:unknown 和 any 的區(qū)別?A:unknown 必須顯式類型檢查后才能使用,而 any 完全跳過類型安全。
Q:函數(shù)聲明返回 void 卻返回了值會(huì)怎樣?A:TypeScript 不會(huì)報(bào)錯(cuò),但這是邏輯矛盾,建議保持聲明與實(shí)際一致。
Q:什么時(shí)候必須用 never?A:當(dāng)函數(shù)永遠(yuǎn)不會(huì)正常返回時(shí)(如無限循環(huán)),或用于類型收窄的兜底檢查。
到此這篇關(guān)于TypeScript中void、never、any、unknown類型的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)TypeScript void、never、any、unknown內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS實(shí)現(xiàn)數(shù)組淺拷貝和深拷貝的方法
淺拷貝創(chuàng)建一個(gè)新的對(duì)象,來接受重新復(fù)制或引用的對(duì)象值,如果對(duì)象屬性是基本的數(shù)據(jù)類型,復(fù)制的就是基本類型的值給新對(duì)象,這篇文章主要介紹了js實(shí)現(xiàn)數(shù)組淺拷貝和深拷貝,需要的朋友可以參考下2024-01-01
JavaScript檢測(cè)并限制復(fù)選框選中個(gè)數(shù)的方法
這篇文章主要介紹了JavaScript檢測(cè)并限制復(fù)選框選中個(gè)數(shù)的方法,涉及javascript針對(duì)復(fù)選框的判定與運(yùn)算相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-08-08
javascript學(xué)習(xí)總結(jié)之js使用技巧
本篇文章給大家分享javascript學(xué)習(xí)總結(jié)之js使用技巧,都是精華喔~小伙伴快來學(xué)習(xí)吧。2015-09-09
JS實(shí)現(xiàn)網(wǎng)頁煙花動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)網(wǎng)頁煙花動(dòng)畫效果,點(diǎn)擊鼠標(biāo)煙花向四周擴(kuò)散,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
使用JavaScript下載圖片并保存到本地超詳細(xì)實(shí)例代碼
在JavaScript(JS)中,圖片下載通常涉及到前端與后端的交互,下面這篇文章主要介紹了使用JavaScript下載圖片并保存到本地的相關(guān)資料,文中通過代碼及圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-05-05
JS實(shí)現(xiàn)頁面數(shù)據(jù)無限加載
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)頁面數(shù)據(jù)無限加載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09

