TS 把類當做接口使用

把類當做接口使用

類定義會創建兩個東西:類的實例類型和一個構造函數。因爲類可以創建出類型,所以你能夠在允許使用接口的地方使用類。

class Point {
    x!: number;
    y!: number;
}
interface Point3d extends Point {
    z: number;
}
let point3d: Point3d = {x: 1, y: 2, z: 3};

接口繼承類

當接口繼承了一個類類型時,它會繼承類的成員但不包括其實現。就好像接口聲明瞭所有類中存在的成員,但並沒有提供具體實現一樣。接口同樣會繼承到類的 private 和 protected 成員。這意味着當你創建了一個接口繼承了一個擁有私有或受保護的成員的類時,這個接口類型只能被這個類或其子類所實現(implement)。

當你有一個龐大的繼承結構時這很有用,但要指出的是你的代碼只在子類擁有特定屬性時起作用。這個子類除了繼承至基類外與基類沒有任何關係。 

例:

class Control {
    private state: any;
}
interface SelectableControl extends Control {
    select(): void;
}
class Button extends Control implements SelectableControl {
    select() { }
}
class TextBox extends Control {
    select() { }
}
// 錯誤:“Image”類型缺少“state”屬性。
class Image implements SelectableControl {
    select() { }
}
class Location {
}

在上面的例子裏,SelectableControl 包含了 Control 的所有成員,包括私有成員 state。因爲 state 是私有成員,所以只能夠是 Control 的子類們才能實現 SelectableControl 接口。因爲只有 Control 的子類才能夠擁有一個聲明於 Control 的私有成員 state,這對私有成員的兼容性是必需的。

在 Control 類內部,是允許通過 SelectableControl 的實例來訪問私有成員 state 的。實際上, SelectableControl 接口和擁有 select 方法的 Control 類是一樣的。Button 和 TextBox 類是 SelectableControl 的子類(因爲它們都繼承自 Control 並有 select 方法),但 Image 和 Location 類並不是這樣的。

允許創建一個對抽象類型的引用

abstract class Department {
  constructor(public name: string) {
  }
  printName(): void {
      console.log('Department name: ' + this.name);
  }
  abstract printMeeting(): void; // 必須在派生類中實現
}
class AccountingDepartment extends Department {
  constructor() {
      super('Accounting and Auditing'); // 在派生類的構造函數中必須調用 super()
  }
  printMeeting(): void {
      console.log('The Accounting Department meets each Monday at 10am.');
  }
  generateReports(): void {
      console.log('Generating accounting reports...');
  }
}
let department: Department; // 允許創建一個對抽象類型的引用
department = new Department(); // 錯誤: 不能創建一個抽象類的實例
department = new AccountingDepartment(); // 允許對一個抽象子類進行實例化和賦值
department.printName();
department.printMeeting();
department.generateReports(); // 錯誤: 方法在聲明的抽象類中不存在

抽象類做爲其它派生類的基類使用。它們一般不會直接被實例化。不同於接口,抽象類可以包含成員的實現細節。abstract 關鍵字是用於定義抽象類和在抽象類內部定義抽象方法。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/iW_K8XfbhV5kdnBpdSqP-w