常见类型简介

TypeScript 中的常见的类型很丰富,包括 :

undefined | null | boolean | number | bigint | string | symbol | void | object | unknown | never | any

其中 undefined | null | boolean | number | bigint | string | symbol | void 是原始类型 (primitive type),object 代表了所有非原始类型(non-primitive type),unknown | never 则是类型论中顶和底类型,而 any 则代表了动态类型。

原始类型除了上述介绍的,还有字面量类型(literal type)和枚举类型(enum type),会在后续章节介绍。

下面的介绍可能会稍微有点难懂,也不够详细,只是先给大家一个初步的印象,在后续的文章中,会具体描述其含义的。

undefined,null

这两个类型都只有一个值,而且值的名称和类型的名称相同,举个例子:
image.png

在 TypeScript 中有两个声明空间(declaration space),类型声明空间和值声明空间(注:spec 中还提到namespace 声明空间,在初学时候,我们一般不使用)。

其中绿色的 undefined 是在类型声明空间中,如果是,而蓝色的 undefined 在值的声明空间中。

所有在类型声明空间中的代码都会在编译成 js 时候被 tsc 或者 babel-plugin-transform-typescript 抹去。只留下值空间的代码。

课外小知识:由于这两个类型都只有一个实例,所以这两个类型都可以被称为 Unit Type

boolean

boolean 是只有两个实例的类型。true 和 false。

number,bigint

4.3.20Number valueprimitive value corresponding to a double-precision 64-bit binary format IEEE 754-2008 value number 就相当于 c 语言中的 double(都符合同一个标准) BigInt is a new primitive that provides a way to represent whole numbers larger than 2, which is the largest number Javascript can reliably represent with the Number primitive.

bigint 就是一个表示范围无穷大的整数类型

string

字符串类型

symbol

symbol 是一种特殊的类型。初级使用建议先不了解。
其中还有一个特殊的语法 unique symbol,有兴趣的话你可以自己先看。

void

对变量赋值为 void 类型用途不大,这时候只相当于 undefined 类型的别名。(undefined 是 unit type,所以在某些编程语言中把 void 称为 unit,比如 kotlin)。
但 void 实际上是一个有特殊处理的类型,和 undefined 并非互为别名的关系,我会在后续章节介绍。
void 一般用于函数的返回值声明。

object

object is a type that represents the non-primitive type, i.e. any thing that is not number, string, boolean, symbol, null, or undefined.


unknown

unknown type 是 TypeScript 中的 Top Type。符号是(⊤)

换句话说,就是任何类型都是 unknown 的子类型,unknown 是所有类型的父类型。

换句最简单的话说,就是 任何值都可以赋值给类型是 unkown 的变量,与其对应的是,我们不能把一个 unkown 类型的值赋值给任意非 unkown 类型的值。

  1. let a: unknown = undefined
  2. a = Symbol('deep dark fantasy')
  3. a = {}
  4. a = false
  5. a = '114514'
  6. a = 1919n
  7. let b : bigint = a; // Type 'unknown' is not assignable to type 'bigint'.

never

never 的行为与 unknown 相反,never 是 TypeScript 中的 Bottom Type。符号是(⊥)

换句话说,就是任何类型都是 never 的父类型,never 是所有类型的子类型。

换句最简单的话说,就是类型是 never 的值都可以赋值给任何类型的变量,与其对应的是,我们不能把一个 unkown 类型的值赋值给任意非 unkown 类型的值。

  1. let a: never = undefined // Type 'undefined' is not assignable to type 'never'
  2. let b : bigint = a;

某个变量的类型是 never 一般表示程序不会执行到这里。
某个函数的返回值类型是 never,一般表示这个函数会 抛出异常,或者永不停机,不会正常返回。

any

any 是 ts 中让人最爱最恨的特性。它是渐进类型系统中的动态类型。
它的出现意味着这里这一小部分将不会有任何类型检查,你想让它是啥类型,它就是啥类型。
我们一般用于过于动态的函数的类型声明,比如 eval 之类的函数。
或者在工程上已有的类型声明错误,我进行强制声明成 any 然后抢救一下。
这是危险的功能,慎用!