面向JavaScript开发者的TypeScript指南
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
TypeScript 与 JavaScript 之间有一种特殊的关系。TypeScript 在完全兼容 JavaScript 所有特性的基础上,额外提供了一套类型系统。 例如,JavaScript 提供了诸如 这意味着,现有的可运行的 JavaScript 代码,本质上也是合法的 TypeScript 代码。TypeScript 的主要优势在于,它可以帮助你发现代码中意料之外的行为,从而降低出错的可能性。 本教程将简要介绍 TypeScript,并重点讲解其类型系统。
|
| 类型 | 判断条件 |
|---|---|
string | typeof s === "string" |
number | typeof n === "number" |
boolean | typeof b === "boolean" |
undefined | typeof v === "undefined" |
function | typeof f === "function" |
array | Array.isArray(a) |
例如,可以根据传入参数的类型(字符串或数组)返回不同的结果:
function wrapInArray(obj: string | string[]) { if (typeof obj === "string") { return [obj]; // (parameter) obj: string } return obj;}
泛型为类型引入了“变量”的能力。一个常见的例子是数组:不带泛型的数组可以包含任意类型的值,而带泛型的数组则可以明确描述数组中元素的类型。
type StringArray = Array<string>;type NumberArray = Array<number>;type ObjectWithNameArray = Array<{ name: string }>;
你也可以声明带有泛型参数的自定义类型:
interface Backpack<Type> { add: (obj: Type) => void; get: () => Type;}// 下面这行是告诉 TypeScript 存在一个叫 backpack 的常量declare const backpack: Backpack<string>;// object 是 string 类型,因为我们在上面将 Backpack 的类型参数指定为了 string。const object = backpack.get();// 由于 backpack 的泛型是 string,因此不能向 add 方法传入 number 类型的值。backpack.add(23);// ❌ 报错:类型 "number" 的参数不能赋值给类型 "string" 的参数。
TypeScript 的核心原则之一是:类型检查关注的是值的“结构”。这种方式有时也被称为鸭子类型(duck typing)或结构类型(structural typing)。
译者注:
所谓鸭子类型,就是那句话:“如果它看起来像鸭子、叫起来像鸭子,那它就是鸭子。”
在TypeScript里,只要一个对象结构上(具有的字段和类型)满足某个接口,那它就可以被当成那个接口类型使用。即便它从来没有
implements过这个接口。
在结构类型系统中,只要两个对象具有相同的结构,它们就会被视为相同的类型。
interface Point { x: number; y: number;}function logPoint(p: Point) { console.log(`${p.x}, ${p.y}`);}// 输出 "12, 26"const point = { x: 12, y: 26 };logPoint(point);
上面的 point 变量并没有显式声明为 Point 类型,但在类型检查时,TypeScript 会将 point 的结构与 Point 的结构进行对比。由于它们结构一致,因此该代码可以通过编译。
结构匹配只要求对象的部分字段与目标类型一致即可:
const point3 = { x: 12, y: 26, z: 89 };logPoint(point3); // 输出 "12, 26"const rect = { x: 33, y: 3, width: 30, height: 80 };logPoint(rect); // 输出 "33, 3"const color = { hex: "#187ABF" };logPoint(color);// ❌ 报错:类型 '{ hex: string; }' 无法赋值给参数类型 'Point'// 缺少属性 x 和 y
在结构类型系统中,class 和 object 的结构匹配方式是一样的:
class VirtualPoint { x: number; y: number; constructor(x: number, y: number) { this.x = x; this.y = y; }}const newVPoint = new VirtualPoint(13, 56);logPoint(newVPoint); // 输出 "13, 56"
只要对象或类拥有所需的全部属性,TypeScript 就认为它们是兼容的,而不会关心具体的实现细节。
译者解读:
这篇官方文档向有 JavaScript 开发经验的开发者,介绍了TypeScript的核心特性。这些特性都是JavaScript中不存在的,主要包括了这么一些概念:
TypeScript会自动做类型推断,也可以开发者手动标注。
TypeScript是结构类型系统,又被称之为鸭子类型。这是非常非常重要的一个知识点,和C#以及Java这种“名义类型系统”有着非常大的区别。
TypeScript支持联合类型,就是将不同类型组合起来,这也是传统的名义类型系统做不到的。
TypeScript也支持泛型。
类型在编译时完全擦除。
阅读原文:原文链接