TypeScript 类型系统
TypeScript 的类型系统被设计为可选的,因此,你的 JavaScript 就是 TypeScript;
TypeScript 不会阻止 JavaScript 的运行,即使存在类型错误也不例外,这能让你的 JavaScript 逐步迁移至 TypeScript。
TypeScript 是一种由微软开发的自由和开源的编程语言,它是 JavaScript 的一个超集,扩展了 JavaScript 的语法。
原始类型
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 来表示一个函数没有一个返回值
泛型
在计算机科学中,许多算法和数据结构并不会依赖于对象的实际类型。但是,你仍然会想在每个变量里强制提供约束。例如:在一个函数中,它接受一个列表,并且返回这个列表的反向排序,这里的约束是指传入至函数的参数与函数的返回值。
在 TypeScript 中,泛型可以让我们编写更加通用的代码,减少代码重复和冗余,提高代码的可复用性和可扩展性。
容器类数据结构:例如数组、列表、堆栈、队列等,可以使用泛型来实现通用的容器类数据结构,以便支持不同类型的元素。
函数:当函数需要支持多种类型的参数或返回值时,可以使用泛型来实现通用的函数。例如,可以编写一个通用的排序函数,支持对任意类型的数组进行排序。
类:当类需要支持多种类型的属性或方法时,可以使用泛型来实现通用的类。例如,可以编写一个通用的树节点类,支持存储任意类型的数据。
联合类型
在 JavaScript 中,你可能希望属性为多种类型之一,如字符串或者数组。这正是 TypeScript 中联合类型能派上用场的地方(它使用 | 作为标记,如 string | number)。
交叉类型
在 JavaScript 中, extend 是一种非常常见的模式,在这种模式中,你可以从两个对象中创建一个新对象,新对象拥有着两个对象所有的功能。
元组类型
JavaScript 并不支持元组,开发者们通常只能使用数组来表示元组。而 TypeScript 支持它,开发者可以使用 :[typeofmember1, typeofmember2] 的形式,为元组添加类型注解,元组可以包含任意数量的成员。