溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

TS中never,void,unknown類型怎么使用

發(fā)布時(shí)間:2023-05-05 10:24:26 來源:億速云 閱讀:102 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“TS中never,void,unknown類型怎么使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“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)格模式下)// - 或者檢查到無法訪問的代碼// 但是由于 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ù)中使用場景:

    // 如果什么都不寫,此時(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 類型

    舉例:

    TS中never,void,unknown類型怎么使用

    TS中never,void,unknown類型怎么使用

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

    舉例:

    TS中never,void,unknown類型怎么使用

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

    1.只能對(duì) unknown 類型進(jìn)行 相等 或 不等 操作, 不能進(jìn)行其它操作;2.unknown 類型的值不能訪問創(chuàng)建實(shí)例的屬性, 方法;3.使用映射類型時(shí), 如果遍歷的是 unknown 類型, 那么不會(huì)映射任何屬性。

    四. 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):

    TS中never,void,unknown類型怎么使用

    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í)例的屬性, 方法:

    TS中never,void,unknown類型怎么使用

    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>

    感謝各位的閱讀,以上就是“TS中never,void,unknown類型怎么使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)TS中never,void,unknown類型怎么使用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI