TypeScript/TS基础知识

32 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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类型是可以的。

image.png

let val: unknown = 18;
let num: number;
let value: any;
num = val;
value = val;

上面的操作实际上正确的,只是编辑器认为不合法,因为它不知道这 unknown 类型的值当前是number类型,那么有解决方案如下

  1. 使用类型断言
let val: unknown = 18;
let num: number;
num = val as number;

  1. 使用类型缩小
let val: unknown = 18;
let num: number;

if (typeof val === 'number') {
    num = val;
}

unknown 类型与任何其他类型组成的交叉类型都是其他类型

unknown类型

定义number和unknown 的交叉类型,最终的类型就是number类型 定义unknown和boolean的交叉类型,最终的类型就是boolean类型 所以unknown和任何其他类型的交叉,都是其他类型, 下面给number&unknown类型赋值一个字符串编辑器直接报错 image.png

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类型

image.png 与any类型的联合类型是any类型

image.png 与 boolean类型联合类型是unknown类型

image.png 总之和任何非any类型的类型联合,最后都是 unknown 类型

never 类型是 unknown 类型的子类型

type Type1 = never extends unknown ? true : false;

这个类型定义定义的意思是如果never 是 unknown类型的子类型,Type1就是true类型否则就是false类型,果然是true,所以never类型是unknown类型的子类型

image.png