类接口 · TypeScript 入门教程 (xcatliu.com)
① 类
Cat 和 Dog 都继承自 Animal,但是分别实现了自己的 eat 方法。此时针对某一个实例,我们无需了解它是 Cat 还是 Dog,就可以直接调用 eat 方法,程序会自动判断出来应该如何执行 eatpublic 表示公有属性或方法TypeScript中类的用法
public 的private 类似,区别是它在子类中也是允许被访问的- class Animal {
- public name;
- public constructor(name) {
- this.name = name;
- }
- }
-
- let a = new Animal('Jack');
- console.log(a.name); // Jack
- a.name = 'Tom';
- console.log(a.name); // Tom

使用private修饰的属性或者方法,在子类中也是不允许访问的

protected 修饰的,允许在子类中访问
- class Animal {
- protected name
- public constructor(name: string) {
- this.name = name
- }
- }
-
- class Cat extends Animal {
- constructor(name: string) {
- super(name)
- console.log(this.name)
- }
- }
构造函数修饰为 private 时,该类不允许被继承或者实例化

当构造函数修饰为 protected 时,该类只允许被继承

参数属性
- class Animal {
- // public name: string;
- public constructor(public name) {
- // this.name = name;
- }
- }
readonly : 只读属性关键字,只允许出现在属性声明或索引签名或构造函数中

- class Animal {
- // public readonly name;
- public constructor(public readonly name) {
- // this.name = name;
- }
- }
抽象类
abstract 用于定义抽象类和其中的抽象方法
(1)抽象类是不允许被实例化的

(2) 抽象类中的抽象方法必须被子类实现
- abstract class Animal {
- public name
- public constructor(name: string) {
- this.name = name
- }
- public abstract sayHi(): any
- }
-
- class Cat extends Animal {
- public eat() {
- console.log(`${this.name} is eating.`)
- }
- public sayHi(): any {
- console.log(`Meow, My name is ${this.name}`)
- }
- }
-
- let cat = new Cat('Tom')
① 接口可以对类的一部分行为进行描述
② 类实现接口
门是一个类,防盗门是门的子类,如果防盗门有一个报警器的功能,可以给防盗门添加一个报警方法,如果有另一个类:车,也有报警器的功能,就可以考虑把报警器提取出来,作为一个接口,防盗门和门都去实现它
- interface Alarm {
- alert(): void
- }
-
- class Door {}
-
- class SecurityDoor extends Door implements Alarm {
- alert() {
- console.log('SecurityDoor alert')
- }
- }
-
- class Car implements Alarm {
- alert() {
- console.log('Car alert')
- }
- }

③ 接口继承接口
lightOn 和 lightOff- interface Alarm {
- alert(): void
- }
-
- interface LightableAlarm extends Alarm {
- lightOn(): void
- lightOff(): void
- }
④ 接口继承类

接口继承类的时候,只会继承它的实例属性和实例方法
① 泛型的概念
- function createArray
(length: number, value: T): Array { - let result: T[] = []
- for (let i = 0; i < length; i++) {
- result[i] = value
- }
- return result
- }
-
- console.log(createArray<string>(3, 'x'))
- function swap
(tuple: [T, U]): [U, T] { - return [tuple[1], tuple[0]]
- }
-
- console.log(swap([7, 'seven']))
② 泛型的约束

可以对泛型进行约束,只允许这个函数传入那些包含length属性的变量,这就是泛型约束


多个类型参数之间可以互相约束

③ 泛型接口
- interface CreateArrayFunc {
-
(length: number, value: T): Array - }
-
- let createArr: CreateArrayFunc
- createArr = function
(length: number, value: T): Array { - let result: T[] = []
- for (let i = 0; i < length; i++) {
- result[i] = value
- }
- return result
- }
-
- console.log(createArr(3, 'x'))
可以把泛型接口提前到接口名上

④ 泛型类: 泛型可以用于类的类型定义中
- class GenericNumber
{ - zeroValue: T
- add: (x: T, y: T) => T
- }
-
- let myGenericNumber = new GenericNumber<number>()
- myGenericNumber.zeroValue = 0
- myGenericNumber.add = function (x, y) {
- return x + y
- }
⑤ 泛型参数的默认类型
TypeScript 2.3 之后,就可以为泛型中的类型参数指定默认类型,当使用泛型时,没有在代码中直接指定类型参数,从实际值参数中也无法推测出时,这个默认类型就会起作用

① 函数的合并(重载)
- function reverse(x: number): number;
- function reverse(x: string): string;
- function reverse(x: number | string): number | string {
- if (typeof x === 'number') {
- return Number(x.toString().split('').reverse().join(''));
- } else if (typeof x === 'string') {
- return x.split('').reverse().join('');
- }
- }
② 接口的合并



③ 类的合并
类的合并与接口的合并规则一致
① allowJs 允许编译js文件
② allowSyntheticDefaultImports 允许对不包含默认导出的模块使用默认导入。这个选项不会影响生成的代码,只会影响类型检查