TypeScript 类型系统
- TypeScript 的类型系统被设计为可选的,因此,你的 JavaScript 就是 TypeScript;
- TypeScript 不会阻止 JavaScript 的运行,即使存在类型错误也不例外,这能让你的 JavaScript 逐步迁移至 TypeScript。
原始类型
JavaScript 原始类型也同样适应于 TypeScript 的类型系统,因此string、number、boolen也可以被用作类型注解。
数组
TypeScript 为数组提供了专用的类型语法,因此你可以很轻易的注解数组。它使用后缀[],接着可以根据需要补充任何有效的类型注解。如:boolen[]能让你安全的使用任何有关数组的操作,而且它也能防止一些类似于赋值错误类型给成员的行为。
内联类型注解
与创建一个接口不同,可以使用内联注解语法注解任何内容。内联类型能为你快速的提供一个类型注解。它可以帮助你省去为类型起名的麻烦。然而,如果发现需要多次使用相同的内联注解时,那么考虑把它重构为一个接口是一个不错的主意。
特殊类型
除了被提到的一些原始类型,在 TypeScript 中,还存在一些特殊的类型,它们是any、null、undefined和 void.
any
any类型在 TypeScript 类型系统中占有特殊的地位。它提供给你一个类型系统的「后门」,TypeScript 将会把类型检查关闭。在类型系统里 any 能够兼容所有的类型(包括它自己)。因此,所有类型都能被赋值给它,它也能被赋值给其他任何类型。
当你把 JavaScript 迁移至 TypeScript 时,你将会经常性使用 any。但你必须减少对它的依赖,因为你需要确保类型安全。当使用 any 时,你基本上是在告诉 TypeScript 编译器不要进行任何的类型检查。
null 和 undefined
在类型系统中,JavaScript 中的 null 和 undefined 字面量和其他被标注了 any 类型的变量一样,都能被赋值给任意类型的变量。
void
使用 :void 来表示一个函数没有一个返回值
泛型
在计算机科学中,许多算法和数据结构并不会依赖于对象的实际类型。但是,你仍然会想在每个变量里强制提供约束。例如:在一个函数中,它接受一个列表,并且返回这个列表的反向排序,这里的约束是指传入至函数的参数与函数的返回值。
联合类型
在 JavaScript 中,你可能希望属性为多种类型之一,如字符串或者数组。这正是 TypeScript 中联合类型能派上用场的地方(它使用 | 作为标记,如 string | number)。
交叉类型
在 JavaScript 中, extend 是一种非常常见的模式,在这种模式中,你可以从两个对象中创建一个新对象,新对象拥有着两个对象所有的功能。
元组类型
JavaScript 并不支持元组,开发者们通常只能使用数组来表示元组。而 TypeScript 支持它,开发者可以使用 :[typeofmember1, typeofmember2] 的形式,为元组添加类型注解,元组可以包含任意数量的成员。