类型系统

TypeScript 的类型系统与 Java 和 C# 更加相似。TypeScript 中的变量类型是静态的,每一个变量都有一个固定的类型。变量类型在声明时指定,格式为 变量名: 类型名,例如 let a: number = 1;。如果在声明变量时没有显式指定类型,那么 TypeScript 将在第一次赋值时自动推断变量的类型。变量的类型一旦确定就不能再更改,向其赋予其他类型的值会引发错误。注意,TypeScript 中的变量是可空的,允许变量保存 null 值;如果编译时开启了 --strictNullChecks,就需要使用联合类型定义来允许变量保存空值,例如 string | null

定义函数时,除了需要定义各个参数的类型,还需要定义函数的返回值类型。函数声明中的类型定义格式为 function funcName(argName: argType): returnType。TypeScript 支持默认参数和可选参数,这两种参数都需要放置在参数表尾部,其中默认参数格式为 argName: argType = defaultValue,可选参数格式为 argName?: argType。由于 TypeScript 是静态类型语言,所以 TypeScript 中支持函数重载。由于在 JavaScript 中一切都是对象,所以 TypeScript 也不例外,函数在 TypeScript 中也有自己的类型,格式为 (argName: argType) => returnType,在平时使用中可以通过 type 关键字来定义函数类型的别名以简化函数类型的使用,格式为 type alias = (arg: argType) => returnType;

此外,TypeScript 支持泛型,格式为 <Type>。泛型可以使函数与类能够将类型作为一种可变元素来进行通用化处理。例如定义一个泛型函数格式为 function funcName<T>(arg: T): T,其中类型标记 T 就用于指代传入泛型函数的类型,在调用时可以使用 funcName<number>(1) 的格式来指定要使用的类型。在类中使用泛型,也同样需要使用 <Type>,格式为 class className<T>。在类型标记中,可以使用 extends 关键字来对泛型可以接受的类型进行限制,例如 <T extends string>。限制类型可以是内置类型、类、接口等任何合法类型。

TypeScript 中常用的类型可见下表。

类型名类型格式备注
布尔boolean
数字number
字符串string表示数字,没有整型与浮点的区别
符号symbol表示字符串
数组T[]用元素类型搭配 [] 操作符定义
数组Array<T>泛型定义数组中元素的类型
元组[T, T]用元组中各个元素的类型定义
枚举enum enumName{val, val}
任意类型any可用来存储任何值
Voidvoid用于无返回值函数的返回值类型声明
Nevernever用于函数声明,表示函数无法返回任何值,只会抛出异常
空值null通常与联合类型结合使用,表示变量为可空类型
未定义undefined
组合类型T | T表示将多个类型联合为一个,变量是多个类型的组合
联合类型T | T表示变量可以是多个类型中的一个

Tip

联合类型允许使用数字字面值、字符串字面值来定义变量可取的类型以及值。