天天看點

TypeScript-unknown類型

unknown 類型

  • unknown 類型是​

    ​TS3.0​

    ​ 中新增的一個頂級類型, 被稱作安全的 any

任何類型都可以指派給 ​

​unknown​

​ 類型:

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

如果沒有類型斷言或基于控制流的類型細化, 那麼不能将 unknown 類型指派給其它類型。

錯誤示例:

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

如果沒有類型斷言或基于控制流的類型細化, 那麼不能在 unknown 類型上進行任何操作。

錯誤示例:

let value1: unknown = 123;
value1++;      

正确示例:

let value1: unknown = 123;
(value1 as number)++;      

let value1: unknown = 123;
if (typeof value1 === 'number') {
    value1++;
}      

隻能對 unknown 類型進行 ​

​相等​

​​ 或 ​

​不等​

​ 操作, 不能進行其它操作(因為其他操作沒有意義)。

正确示例:

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

不能進行其它操作(因為其他操作沒有意義), 雖然沒有報錯, 但是不推薦, 如果想報錯提示, 可以打開嚴格模式(​

​"strict": true​

​):

TypeScript-unknown類型
let value1: unknown = 123;
let value2: unknown = 123;
console.log(value1 >= value2);      

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

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

unknown 除了與 any 以外, 與其它任何類型組成的聯合類型最後都是 ​

​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 類型的值不能通路建立執行個體的屬性, 方法:

TypeScript-unknown類型
class Person {
    name: string = 'BNTang';

    say(): void {
        console.log(`name = ${this.name}`);
    }
}

let p: unknown = new Person();
p.say();
console.log(p.name);      

使用映射類型時, 如果周遊的是 unknown 類型, 那麼不會映射任何屬性:

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

繼續閱讀