目录
概述:
- TS 中的高级类型有很多,重点学习以下高级类型:
- 1. class 类
- 2. 类型兼容性
- 3. 交叉类型
- 4. 泛型 和 keyof
- 5. 索引签名类型 和 索引查询类型
- 6. 映射类型
1. class 类
1.1 class 关键字的基本使用
TypeScript 全面支持 ES2015 中引入的
class
关键字,并为其添加了类型注解和其他语法(比如,可见性修饰符等)。

解释:
- 根据 TS 中的类型推论,可以知道 Person 类的实例对象 p 的类型是 Person。
- TS 中的 class,不仅提供了 class 的语法功能,也作为一种类型存在。
实例属性初始化:

解释:
- 声明成员 age,类型为 number(没有初始值)。
- 声明成员 gender,并设置初始值,此时,可省略类型注解(TS 类型推论 为 string 类型)。
构造函数:

解释:
- 成员初始化(比如,age: number)后,才可以通过 this.age 来访问实例成员。
- 需要为构造函数指定类型注解,否则会被隐式推断为 any;构造函数不需要返回值类型。
实例方法:

解释:
- 方法的类型注解(参数和返回值)与函数用法相同。
1.2 类继承
类继承的两种方式:
- extends(继承父类)
- implements(实现接口)
说明:
- JS 中只有 extends,而 implements 是 TS 提供的。
① extends(继承父类)
解释:
- 通过 extends 关键字实现继承。
- 子类 Dog 继承父类 Animal,则 Dog 的实例对象 dog 就同时具有了父类 Animal 和 子类 Dog 的所有属性和方法。
② implements(实现接口)
解释:
- 通过 implements 关键字让 class 实现接口。
- Person 类实现接口 Singable 意味着,Person 类中必须提供 Singable 接口中指定的所有方法和属性。
1.3 类成员可见性
类成员可见性:
- 可以使用 TS 来控制 class 的方法或属性对于 class 外的代码是否可见。
可见性修饰符包括:
- public(公有的)
- protected(受保护的)
- private(私有的)。
①
public(公有的)
- public:表示公有的、公开的,公有成员可以被任何地方访问,默认可见性。

解释:
- 在类属性或方法前面添加 public 关键字,来修饰该属性或方法是共有的。
- 因为 public 是默认可见性,所以,可以直接省略。
② protected(受保护的)
- protected:表示受保护的,仅对其声明所在类和子类中(非实例对象)可见。
解释:
- 在类属性或方法前面添加 protected 关键字,来修饰该属性或方法是受保护的。
- 在子类的方法内部可以通过 this 来访问父类中受保护的成员,但是,对实例不可见!
③ private(私有的)
- private:表示私有的,只在当前类中可见,对实例对象以及子类也是不可见的。
解释:
- 在类属性或方法前面添加 private 关键字,来修饰该属性或方法是私有的。
- 私有的属性或方法只在当前类中可见,对子类和实例对象也都是不可见的!
1.4 类成员只读修饰符
除了可见性修饰符之外,还有一个常见修饰符就是:
readonly(只读修饰符)
。
readonly
:
- 表示只读,用来防止在构造函数之外对属性进行赋值。

解释:
- 使用 readonly 关键字修饰该属性是只读的,注意只能修饰属性不能修饰方法。
- 注意:属性 age 后面的类型注解(比如,此处的 number)如果不加,则 age 的类型为 18 (字面量类型)。
- 接口或者 {} 表示的对象类型,也可以使用 readonly
2. 类型兼容性
2.1 类型兼容性
① 两种类型系统:
- Structural Type System(结构化类型系统)
- Nominal Type System(标明类型系统)。
TS 采用的是结构化类型系统
,也叫做 duck typing(鸭子类型),
类型检查关注的是值所具有的形状
。
也就是说,在结构类型系统中,如果两个对象具有相同的形状,则认为它们属于同一类型。

解释: