本文是自己在学习TypeScript的过程中所记录的需要注意的地方,如果想要学习的话,还是去看官方文档。
1、原始数据类型
使用构造函数 Boolean 创造的对象不是布尔值,直接调用 Boolean 也可以返回一个 boolean 类型
- (×) let createdByNewBoolean: boolean = new Boolean(1);
- (√) let createdByNewBoolean: Boolean = new Boolean(1);
- (√) let createdByBoolean: boolean = Boolean(1);
ES6 中的二进制和八进制表示法,它们会被编译为十进制数字
- let binaryLiteral: number = 0b1010; → var binaryLiteral = 10;
- let octalLiteral: number = 0o744; → var octalLiteral = 484;
声明一个 void 类型的变量没有什么用,因为你只能将它赋值为 undefined 和 null
- (√) let unusable: void = undefined;
与 void 的区别是,undefined 和 null 是所有类型的子类型
- (√) let num: number = undefined;
- (√) let u: undefined; let num: number = u;
- (×) let u: void; let num: number = u;
2、任意值any
- 在任意值上访问任何属性都是允许的
- 声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值
3、类型推论
- 变量如果在声明的时候,未指定其类型,未赋值,那么它会被识别为任意值类型 let something;
4、联合类型
- 只能访问此联合类型的所有类型里共有的属性或方法
- 联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型
5、对象的类型——接口
- 任意属性 [propName: string]: any;
- 一旦定义了任意属性,那么确定属性和可选属性都必须是它的子属性
- readonly id: number;只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候
6、数组的类型
- 类数组(Array-like Object)不是数组类型,比如 arguments
- 常见的类数组都有自己的接口定义,如 IArguments, NodeList, HTMLCollection 等
7、函数的类型
- 在 TypeScript 的类型定义中,=> 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型
- 可选参数后面不允许再出现必须参数了
- 将添加了默认值的参数识别为可选参数,此时就不受「可选参数必须接在必需参数后面」的限制了
- 重载,优先从最前面的函数定义开始匹配,多个函数定义如果有包含关系,需要优先把精确的定义写在前面
8、字符串字面量类型
- 类型别名与字符串字面量类型都是使用 type 进行定义
9、元组
- 当添加越界的元素时,它的类型会被限制为元组中每个类型的联合类型
10、枚举
- 手动赋值的枚举项可以不是数字,此时需要使用类型断言来让 tsc 无视类型检查
enum Days {Sun = 7, Mon, Tue, Wed, Thu, Fri, Sat = “S”}; - 手动赋值的枚举项也可以为小数或负数,此时后续未手动赋值的项的递增步长仍为 1
- 枚举项有两种类型:常数项和计算所得项,如果紧接在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错
11、类
-
三种修饰符 public、private 和 protected
1、public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public的
2、private 修饰的属性或方法是私有的,不能在声明它的类的外部访问需要注意的是,编译之后的代码中,并没有限制 private 属性在外部的可访问性
3、protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的
-
抽象类是供其他类继承的基类,抽象类不允许被实例化。抽象类中的抽象方法必须在子类中被实现
12、类与接口
- 一个类可以实现多个接口
class Car implements Alarm, Light{} - 接口与接口之间可以是继承关系
interface LightableAlarm extends Alarm{} - 接口也可以继承类
interface Point3d extends Point{}
13、生命合并
- 可以使用重载定义多个函数类型
- 接口中的属性在合并时,合并的属性的类型必须是唯一的
- 接口中方法的合并,与函数的合并一样
- 类的合并与接口的合并规则一致