1、void
void
表示没有任何类型,和其他类型是平等关系,不能直接赋值。我们只能为它赋值null或undefined(在strictNullChecks
未指定为true时)。一般只有在函数没有返回值时去声明。
2、never
never
类型表示的是那些永不存在的值的类型。
值会永不存在的两种情况:
(1)如果一个函数执行时抛出了异常,那么这个函数永远不存在返回值(因为抛出异常会直接中断程序运行,这使得程序运行不到返回值那一步,即具有不可达的终点,也就永不存在返回了);
(2)函数中执行无限循环的代码(死循环),使得程序永远无法运行到函数返回值那一步,永不存在返回。
注意点:没有类型是never
的子类型或可以赋值给never
类型(除了never
本身之外),即使any
也不可以赋值给never
使用 never 避免出现新增了联合类型没有对应的实现,目的就是写出类型绝对安全的代码。
3、symbol
自ECMAScript 2015起,symbol
成为了一种新的原生类型,就像number
和string
一样。
(1)symbol的值是唯一的
(2)symbol只支持string和number类型的参数
(3)symbol可用作对象属性的键
(4)使用symbol定义的属性,可通过Object.getOwnPropertySymbols()或
Reflect.ownKeys()拿到对象的所有属性
(5)symbol可支持遍历大部分类型迭代器 arr nodeList argumetns set map 等
4、any
在 TypeScript 中,任何类型都可以被归为 any 类型。这让 any 类型成为了类型系统的顶级类型.
变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型
5、unknown
unknown
与any
一样,所有类型都可以分配给unknown
unknown与any的区别:任何类型的值可以赋值给any
,同时any
类型的值也可以赋值给任何类型。unknown
任何类型的值都可以赋值给它,但它只能赋值给unknown
和any
6、Number、String、Boolean、Symbol
原始类型:number、string、boolean、symbol
对象类型(原始类型的包装对象):Number、String、Boolean、Symbol
从类型兼容性上看,原始类型兼容对应的对象类型,反过来对象类型不兼容对应的原始类型。
不要使用对象类型来注解值的类型
7、object、Object和{}
JavaScript 中以下类型被视为原始类型:string
、boolean
、number
、bigint
、symbol
、null
和 undefined
。
(1)小object 代表的是所有非原始类型,也就是说我们不能把 number、string、boolean、symbol等 原始类型赋值给 object。在严格模式下,null
和 undefined
类型也不能赋给 object。
(2)大Object 代表所有拥有 toString、hasOwnProperty 方法的类型,所以所有原始类型、非原始类型都可以赋给 Object。同样,在严格模式下,null 和 undefined 类型也不能赋给 Object。
大 Object 包含原始类型,小 object 仅包含非原始类型;大 Object 不仅是小 object 的父类型,同时也是小 object 的子类型。
(3){}空对象类型和大 Object 一样,也是表示原始类型和非原始类型的集合,并且在严格模式下,null 和 undefined 也不能赋给 {}
总结:{}、大 Object 是比小 object 更宽泛的类型(least specific),{} 和大 Object 可以互相代替,用来表示原始类型(null、undefined 除外)和非原始类型;而小 object 则表示非原始类型。