欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

TS?中?never,void,unknown類(lèi)型詳解

 更新時(shí)間:2023年05月05日 09:41:00   作者:Web_boom  
這篇文章主要介紹了TS?中?never,void,unknown類(lèi)型詳解,never?類(lèi)型是 TypeScript 中的底層類(lèi)型,unknown是TypeScript中比較特殊的一種類(lèi)型,它用于描述類(lèi)型不確定的變量,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下

TS 中 never,void,unknown類(lèi)型詳解

一. never

never 類(lèi)型是 TypeScript 中的底層類(lèi)型。它在以下情況中很好的被使用:

  • 一個(gè)從來(lái)不會(huì)有返回值的函數(shù),即死循環(huán)(如:如果函數(shù)內(nèi)含有 while(true) {});
  • 一個(gè)總是會(huì)拋出錯(cuò)誤的函數(shù)(如:function foo() { throw new Error('Not Implemented') },foo 的返回類(lèi)型是 never);
 function foo(): never {//永遠(yuǎn)不會(huì)返回結(jié)果 // 死循環(huán) while(true) {}
 }
function bar(): never {throw new Error()
 } 

never 僅能被賦值給另外一個(gè) never 類(lèi)型,因此可以用它來(lái)進(jìn)行編譯時(shí)的全面的檢查

舉例:

function foo(x: string | number): boolean {if (typeof x === 'string') {return true;} else if (typeof x === 'number') {return false;}// 如果不是一個(gè) never 類(lèi)型,這會(huì)報(bào)錯(cuò):// - 不是所有條件都有返回值 (嚴(yán)格模式下)// - 或者檢查到無(wú)法訪(fǎng)問(wèn)的代碼// 但是由于 TypeScript 理解 `fail` 函數(shù)返回為 `never` 類(lèi)型// 它可以讓你調(diào)用它,因?yàn)槟憧赡軙?huì)在運(yùn)行時(shí)用它來(lái)做安全或者詳細(xì)的檢查。return fail('Unexhaustive');
}
function fail(message: string): never {throw new Error(message);
} 

二. void(空值)

JavaScript 沒(méi)有空值(void)的概念,在 TypeScript 中,表示沒(méi)有任何返回值的函數(shù)

// 沒(méi)有返回值的函數(shù),其返回值類(lèi)型為 void
function alertName(): void { alert('My name is Tom'); } 

當(dāng)然你也可以聲明一個(gè)變量為void ,但你只能將它賦值為 undefined 和 null:

let unusable: void = undefined; 

void函數(shù)中使用場(chǎng)景:

// 如果什么都不寫(xiě),此時(shí),add 函數(shù)的返回值類(lèi)型為: void
const add = () => { //
}
// 如果return之后什么都不寫(xiě),此時(shí),add 函數(shù)的返回值類(lèi)型為: void
const add = () => {  return 
}
const add = (): void => {// 此處,返回的 undefined 是 JS 中的一個(gè)值return undefined
}
// 這種寫(xiě)法是明確指定函數(shù)返回值類(lèi)型為 void,與上面不指定返回值類(lèi)型相同
const add = (): void => {// 
} 

三. unknown

unknown是TypeScript中比較特殊的一種類(lèi)型,它用于描述類(lèi)型不確定的變量。這與any類(lèi)型相似,但更安全,因?yàn)閷?duì)未知值做任何事情都是不合法的。

function foo() {return 'abc'
}
function bar() {return 123
}
// unknown類(lèi)型只能賦值給any和unknown類(lèi)型
// any類(lèi)型可以賦值給任意類(lèi)型
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) 

需要通過(guò)類(lèi)型范圍縮小類(lèi)型斷言,才能在 unknown 類(lèi)型上進(jìn)行任何操作

舉例:

let value: unknown = 123;
console.log(++value )//error:'value' is of type 'unknown'.
console.log(++(value as number) ) 

unknown 除了與 any 以外, 與其它任何類(lèi)型組成的聯(lián)合類(lèi)型最后都是 unknown 類(lèi)型

舉例:

unknown 與其它任何類(lèi)型組成的交叉類(lèi)型最后都是其它類(lèi)型

舉例:

當(dāng)然還有一些別的unkonw特性比如:

1.只能對(duì) unknown 類(lèi)型進(jìn)行 相等 或 不等 操作, 不能進(jìn)行其它操作;2.unknown 類(lèi)型的值不能訪(fǎng)問(wèn)創(chuàng)建實(shí)例的屬性, 方法;3.使用映射類(lèi)型時(shí), 如果遍歷的是 unknown 類(lèi)型, 那么不會(huì)映射任何屬性;以上可以點(diǎn)擊文末詳細(xì)學(xué)習(xí)!

四. never與void的區(qū)別

1.void 表示沒(méi)有任何類(lèi)型,never 表示永遠(yuǎn)不存在的值的類(lèi)型。

2.當(dāng)一個(gè)函數(shù)返回空值時(shí),它的返回值為 void 類(lèi)型,但是,當(dāng)一個(gè)函數(shù)永不返回時(shí)(或者總是拋出錯(cuò)誤),它的返回值為 never 類(lèi)型。void 類(lèi)型可以被賦值(在 strictNullChecking 為 false 時(shí)),但是除了never 本身以外,其他任何類(lèi)型不能賦值給 never

五. 其他注意事項(xiàng)

unknown,never 都不允許執(zhí)行變量的方法以及訪(fǎng)問(wèn)內(nèi)部屬性;

never是所有類(lèi)型的子類(lèi)型;

補(bǔ)充:TypeScript-unknown類(lèi)型

  • unknown 類(lèi)型是 TS3.0 中新增的一個(gè)頂級(jí)類(lèi)型, 被稱(chēng)作安全的 any

任何類(lèi)型都可以賦值給 unknown 類(lèi)型:

let value: unknown;
value = 123;
value = "abc";
value = false;

如果沒(méi)有類(lèi)型斷言或基于控制流的類(lèi)型細(xì)化, 那么不能將 unknown 類(lèi)型賦值給其它類(lèi)型。

錯(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;
}

如果沒(méi)有類(lèi)型斷言或基于控制流的類(lèi)型細(xì)化, 那么不能在 unknown 類(lèi)型上進(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 類(lèi)型進(jìn)行 相等 或 不等 操作, 不能進(jìn)行其它操作(因?yàn)槠渌僮鳑](méi)有意義)。

正確示例:

let value1: unknown = 123;
let value2: unknown = 123;
console.log(value1 === value2);
console.log(value1 !== value2);

不能進(jìn)行其它操作(因?yàn)槠渌僮鳑](méi)有意義), 雖然沒(méi)有報(bào)錯(cuò), 但是不推薦, 如果想報(bào)錯(cuò)提示, 可以打開(kāi)嚴(yán)格模式("strict": true):

let value1: unknown = 123;
let value2: unknown = 123;
console.log(value1 >= value2);

unknown 與其它任何類(lèi)型組成的交叉類(lèi)型最后都是其它類(lèi)型:

type MyType = number & unknown;
type MyType = unknown & string;

unknown 除了與 any 以外, 與其它任何類(lèi)型組成的聯(lián)合類(lèi)型最后都是 unknown 類(lèi)型:

type MyType1 = unknown | any;
type MyType2 = unknown | number;
type MyType3 = unknown | string | boolean;

never 類(lèi)型是 unknown 類(lèi)型的子類(lèi)型:

type MyType = never extends unknown ? true : false;

keyof unknown 等于 never:

type MyType = keyof unknown;

unknown 類(lèi)型的值不能訪(fǎng)問(wèn)創(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);

使用映射類(lèi)型時(shí), 如果遍歷的是 unknown 類(lèi)型, 那么不會(huì)映射任何屬性:

type MyType<T> = {
    [P in keyof T]: any
}
type res = MyType<unknown>

到此這篇關(guān)于TS 中 never,void,unknown類(lèi)型詳解的文章就介紹到這了,更多相關(guān)TS 中 never,void,unknown類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論