unknown 類型
- unknown 類型是
中新增的一個頂級類型, 被稱作安全的 any
TS3.0
任何類型都可以指派給
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
):
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 類型的值不能通路建立執行個體的屬性, 方法:
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>