Visual LabINTERACTIVE LEARNING
JavaScript 内核第 3 / 5 章

接口与结构化类型

掌握接口继承、合并、实现,以及 interface 与 type 的边界。

TypeScript泛型类型体操
进阶预计 48 分钟查看源文 ↗

interface 接口

提示

主要用于声明对象类型,接口中的属性和方法都是抽象的,不需要具体实现

interface Itable {
  head: string;
  body: string;
  foot?: string; //可选属性
  content?: {
    name: string;
    age: number;
  };
}

// 键值对的定义方式 内置的Record 
interface IndexItem {
  [index: string]: string;
}

// 函数类型的接口
interface IAdd {
  (a: number, b: number): number;
}

接口的继承

提示

接口可以继承多个接口

interface ISwim {
  swimming: () = void;
}

interface IFly {
  flying: () = void;
}

interface IAction extends ISwim, IFly {}

const action: IAction = {
  swimming() {},
  flying() {},
};

接口的合并

// 一种组合类型的方式: 联合类型
type WhyType = number | string;
type Direction = "left" | "right" | "center";

// 另一种组件类型的方式: 交叉类型
type WType = number & string;

interface ISwim {
  swimming: () = void;
}

interface IFly {
  flying: () = void;
}

type MyType1 = ISwim | IFly;
type MyType2 = ISwim & IFly;

const obj1: MyType1 = {
  flying() {},
};

const obj2: MyType2 = {
  swimming() {},
  flying() {},
};

接口的实现

interface ISwim {
  swimming: () = void;
}

interface IEat {
  eating: () = void;
}

// 类实现接口
class Animal {}

// 继承: js只能实现单继承
// 实现: 实现接口, 类可以实现多个接口 -类实现 可以比接口定义的属性多
class Fish extends Animal implements ISwim, IEat {
  swimming() {
    console.log("Fish Swmming");
  }

  eating() {
    console.log("Fish Eating");
  }
}

class Person<T implements ISwim<T {
  // 可传泛型
  swimming() {
    console.log("Person Swimming");
  }
}

// 编写一些公共的API: 面向接口编程
function swimAction(swimable: ISwim) {
  swimable.swimming();
}

// 1.所有实现了接口的类对应的对象, 都是可以传入
swimAction(new Fish());
swimAction(new Person());

swimAction({ swimming: function () {} });

interface 和 type 的区别

继承接口 定义多个相同 实现接口 定义函数类型 声明基本类型
type
interface ✅ 内容会合并

❤️ 提示

建议基本类型使用type,对象类型使用interface