TS?中?never,void,unknown類型詳解
TS 中 never,void,unknown類型詳解
一. never
never 類型是 TypeScript 中的底層類型。它在以下情況中很好的被使用:
- 一個(gè)從來不會(huì)有返回值的函數(shù),即死循環(huán)(如:如果函數(shù)內(nèi)含有
while(true) {}); - 一個(gè)總是會(huì)拋出錯(cuò)誤的函數(shù)(如:
function foo() { throw new Error('Not Implemented') },foo的返回類型是never);
function foo(): never {//永遠(yuǎn)不會(huì)返回結(jié)果 // 死循環(huán) while(true) {}
}
function bar(): never {throw new Error()
}
never僅能被賦值給另外一個(gè)never類型,因此可以用它來進(jìn)行編譯時(shí)的全面的檢查
舉例:
function foo(x: string | number): boolean {if (typeof x === 'string') {return true;} else if (typeof x === 'number') {return false;}// 如果不是一個(gè) never 類型,這會(huì)報(bào)錯(cuò):// - 不是所有條件都有返回值 (嚴(yán)格模式下)// - 或者檢查到無(wú)法訪問的代碼// 但是由于 TypeScript 理解 `fail` 函數(shù)返回為 `never` 類型// 它可以讓你調(diào)用它,因?yàn)槟憧赡軙?huì)在運(yùn)行時(shí)用它來做安全或者詳細(xì)的檢查。return fail('Unexhaustive');
}
function fail(message: string): never {throw new Error(message);
} 二. void(空值)
JavaScript 沒有空值(void)的概念,在 TypeScript 中,表示沒有任何返回值的函數(shù)
// 沒有返回值的函數(shù),其返回值類型為 void
function alertName(): void { alert('My name is Tom'); } 當(dāng)然你也可以聲明一個(gè)變量為void ,但你只能將它賦值為 undefined 和 null:
let unusable: void = undefined;
void函數(shù)中使用場(chǎng)景:
// 如果什么都不寫,此時(shí),add 函數(shù)的返回值類型為: void
const add = () => { //
}
// 如果return之后什么都不寫,此時(shí),add 函數(shù)的返回值類型為: void
const add = () => { return
}
const add = (): void => {// 此處,返回的 undefined 是 JS 中的一個(gè)值return undefined
}
// 這種寫法是明確指定函數(shù)返回值類型為 void,與上面不指定返回值類型相同
const add = (): void => {//
} 三. unknown
unknown是TypeScript中比較特殊的一種類型,它用于描述類型不確定的變量。這與any類型相似,但更安全,因?yàn)閷?duì)未知值做任何事情都是不合法的。
function foo() {return 'abc'
}
function bar() {return 123
}
// unknown類型只能賦值給any和unknown類型
// any類型可以賦值給任意類型
let flag = true
let result: unknown // 最好不要使用any
if (flag) {result = foo()
} else {result = bar()
}
let message: string = result //報(bào)錯(cuò)
let num: number = result //報(bào)錯(cuò)
let num1: unknown = result
let num2: any = result
console.log(result) 需要通過類型范圍縮小或類型斷言,才能在 unknown 類型上進(jìn)行任何操作
舉例:
let value: unknown = 123; console.log(++value )//error:'value' is of type 'unknown'. console.log(++(value as number) )
unknown 除了與 any 以外, 與其它任何類型組成的聯(lián)合類型最后都是
unknown類型
舉例:


unknown 與其它任何類型組成的交叉類型最后都是其它類型
舉例:

當(dāng)然還有一些別的unkonw特性比如:
1.只能對(duì) unknown 類型進(jìn)行 相等 或 不等 操作, 不能進(jìn)行其它操作;2.unknown 類型的值不能訪問創(chuàng)建實(shí)例的屬性, 方法;3.使用映射類型時(shí), 如果遍歷的是 unknown 類型, 那么不會(huì)映射任何屬性;以上可以點(diǎn)擊文末詳細(xì)學(xué)習(xí)!
四. never與void的區(qū)別
1.void 表示沒有任何類型,never 表示永遠(yuǎn)不存在的值的類型。
2.當(dāng)一個(gè)函數(shù)返回空值時(shí),它的返回值為 void 類型,但是,當(dāng)一個(gè)函數(shù)永不返回時(shí)(或者總是拋出錯(cuò)誤),它的返回值為 never 類型。void 類型可以被賦值(在 strictNullChecking 為 false 時(shí)),但是除了never 本身以外,其他任何類型不能賦值給 never。
五. 其他注意事項(xiàng)
unknown,never 都不允許執(zhí)行變量的方法以及訪問內(nèi)部屬性;
never是所有類型的子類型;
補(bǔ)充:TypeScript-unknown類型
- unknown 類型是
TS3.0中新增的一個(gè)頂級(jí)類型, 被稱作安全的 any
任何類型都可以賦值給 unknown 類型:
let value: unknown; value = 123; value = "abc"; value = false;
如果沒有類型斷言或基于控制流的類型細(xì)化, 那么不能將 unknown 類型賦值給其它類型。
錯(cuò)誤示例:
let value1: unknown = 123; let value2: number; value2 = value1;
正確示例:
let value1: unknown = 123; let value2: number; value2 = value1 as number;
或
let value1: unknown = 123;
let value2: number;
if (typeof value1 === 'number') {
value2 = value1;
}如果沒有類型斷言或基于控制流的類型細(xì)化, 那么不能在 unknown 類型上進(jìn)行任何操作。
錯(cuò)誤示例:
let value1: unknown = 123; value1++;
正確示例:
let value1: unknown = 123; (value1 as number)++;
或
let value1: unknown = 123;
if (typeof value1 === 'number') {
value1++;
}只能對(duì) unknown 類型進(jìn)行 相等 或 不等 操作, 不能進(jìn)行其它操作(因?yàn)槠渌僮鳑]有意義)。
正確示例:
let value1: unknown = 123; let value2: unknown = 123; console.log(value1 === value2); console.log(value1 !== value2);
不能進(jìn)行其它操作(因?yàn)槠渌僮鳑]有意義), 雖然沒有報(bào)錯(cuò), 但是不推薦, 如果想報(bào)錯(cuò)提示, 可以打開嚴(yán)格模式("strict": true):

let value1: unknown = 123; let value2: unknown = 123; console.log(value1 >= value2);
unknown 與其它任何類型組成的交叉類型最后都是其它類型:
type MyType = number & unknown;
type MyType = unknown & string;
unknown 除了與 any 以外, 與其它任何類型組成的聯(lián)合類型最后都是 unknown 類型:
type MyType1 = unknown | any; type MyType2 = unknown | number; type MyType3 = unknown | string | boolean;
never 類型是 unknown 類型的子類型:
type MyType = never extends unknown ? true : false;
keyof unknown 等于 never:
type MyType = keyof unknown;
unknown 類型的值不能訪問創(chuàng)建實(shí)例的屬性, 方法:

class="language-typescript">class Person {
name: string = 'BNTang';
say(): void {
console.log(`name = ${this.name}`);
}
}
let p: unknown = new Person();
p.say();
console.log(p.name);使用映射類型時(shí), 如果遍歷的是 unknown 類型, 那么不會(huì)映射任何屬性:
type MyType<T> = {
[P in keyof T]: any
}
type res = MyType<unknown>到此這篇關(guān)于TS 中 never,void,unknown類型詳解的文章就介紹到這了,更多相關(guān)TS 中 never,void,unknown類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS實(shí)現(xiàn)數(shù)組扁平化的方法分享
數(shù)組扁平化指的是:將一個(gè)多層嵌套的數(shù)組,處理成只有一層的數(shù)組。本文主要和大家介紹了幾個(gè)常用的JS數(shù)組扁平化方法,希望對(duì)大家有所幫助2023-04-04
Layui 導(dǎo)航默認(rèn)展開和菜單欄選中高亮設(shè)置的方法
今天小編就為大家分享一篇Layui 導(dǎo)航默認(rèn)展開和菜單欄選中高亮設(shè)置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09
基于javascript實(shí)現(xiàn)checkbox復(fù)選框?qū)嵗a
這篇文章主要介紹了基于javascript實(shí)現(xiàn)checkbox復(fù)選框?qū)嵗a,感興趣的小伙伴們可以參考一下2016-01-01
通過js把一個(gè)數(shù)組修改成多層嵌套多個(gè)數(shù)組的幾種方法總結(jié)
這篇文章主要介紹了通過js把一個(gè)數(shù)組修改成多層嵌套多個(gè)數(shù)組的幾種方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
頁(yè)面加載完畢后滾動(dòng)條自動(dòng)滾動(dòng)一定位置
希望頁(yè)面加載完畢后向左自動(dòng)滾動(dòng)一定位置,下面有個(gè)不錯(cuò)的方法可以輕松幫大家實(shí)現(xiàn)下2014-02-02
JS實(shí)現(xiàn)的左側(cè)豎向滑動(dòng)菜單效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)的左側(cè)豎向滑動(dòng)菜單效果代碼,涉及JavaScript響應(yīng)鼠標(biāo)點(diǎn)擊事件操作頁(yè)面元素樣式的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
編寫js擴(kuò)展方法判斷一個(gè)數(shù)組中是否包含某個(gè)元素
判斷集合是否包含某個(gè)元素我們可以利用js的原型擴(kuò)展來封裝一個(gè)我們自己的Contains方法,具體思路及實(shí)現(xiàn)如下,感興趣的朋友可以參考下2013-11-11
微信小程序支付功能 php后臺(tái)對(duì)接完整代碼分享
這篇文章主要為大家詳細(xì)介紹了微信小程序支付功能,分享了php后臺(tái)對(duì)接完整代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06

