开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
unknown 类型
- unknown类 型代表任何类型,这个特性和any类似,但是更安全,因为未知unknown的值做任何事情都是不合法的
- unkknown 类型被称为安全的any
任何类型都可以赋值给unknown类型
下面的赋值操作都是合法的且不会报错
let str: unknown;
str = 19;
str = '实则棒';
str = false;
str = [1, 2, 4]
str = { a: 'ab' }
不能将 unknown 类型赋值给其他类型
下面想把 unknown 类型赋值给 number 类型,编译不通过。当然将 unknown 类型赋值给any类型是可以的。
let val: unknown = 18;
let num: number;
let value: any;
num = val;
value = val;
上面的操作实际上正确的,只是编辑器认为不合法,因为它不知道这 unknown 类型的值当前是number类型,那么有解决方案如下
- 使用类型断言
let val: unknown = 18;
let num: number;
num = val as number;
- 使用类型缩小
let val: unknown = 18;
let num: number;
if (typeof val === 'number') {
num = val;
}
unknown 类型与任何其他类型组成的交叉类型都是其他类型
unknown类型
定义number和unknown 的交叉类型,最终的类型就是number类型
定义unknown和boolean的交叉类型,最终的类型就是boolean类型
所以unknown和任何其他类型的交叉,都是其他类型,
下面给number&unknown类型赋值一个字符串编辑器直接报错
type Type1 = number & unknown;
type Type3 = unknown & boolean;
let a: Type1='';
let c: Type3;
unknown 类型与任何其他类型(除了any)的联合类型都是unknown类型
type Type1 = number | unknown;
type Type2 = unknown | any;
type Type3 = unknown | boolean;
与number类型联合是unknown类型
与any类型的联合类型是any类型
与 boolean类型联合类型是unknown类型
总之和任何非any类型的类型联合,最后都是 unknown 类型
never 类型是 unknown 类型的子类型
type Type1 = never extends unknown ? true : false;
这个类型定义定义的意思是如果never 是 unknown类型的子类型,Type1就是true类型否则就是false类型,果然是true,所以never类型是unknown类型的子类型