Skip to content
On this page

类的类型与接口的关系

定义属性

类实现接口的时候,必须实现接口中所有的属性, 并且可以在类中定义其他的属性

typescript
interface Human {
  name: string;
  eat(): void;
}

class Asian implements Human {
  constructor(name: string) {
    this.name = name;
  }
  name: string;
  eat() {}
  sleep() {}
}
1
2
3
4
5
6
7
8
9
10
11
12
13

接口只能约束类的公有成员

typescript
interface Human {
  name: string;
  eat(): void;
}

/* 错误提示:
类“Asian”错误实现接口“Human”。
  属性“name”在类型“Asian”中是私有属性,但在类型“Human”中不是。
*/
class Asian implements Human {
  constructor(name: string) {
    this.name = name;
  }
  private name: string;
  eat() {}
  sleep() {}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

接口不能约束类的构造函数

typescript
interface Human {
  new (name: string): void;
  name: string;
  eat(): void;
}

/* 错误提示:
类“Asian”错误实现接口“Human”。
  类型“Asian”提供的内容与签名“new (name: string): void”不匹配。ts(2420)
*/
class Asian implements Human {
  constructor(name: string) {
    this.name = name;
  }
  name: string;
  eat() {}
  sleep() {}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

接口的继承

接口继承接口

接口可以像类一样相互继承,并且一个接口可以继承多个接口 接口的继承,可以抽离出可重用的接口, 也可以将多个接口合并成一个接口

typescript
interface Human {
  name: string;
  eat(): void;
}

interface Man extends Human {
  run(): void;
}

interface Child {
  cry(): void;
}

interface Boy extends Man, Child {}

let boy: Boy = {
  name: "",
  eat() {},
  run() {},
  cry() {},
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

接口继承类

相当于接口把类的成员都抽象了出来,也就是只有类的成员接口,而没有具体的实现

typescript
class Auto {
  state = 1;
  // private state2 = 2;
}

// 接口中就隐含了 state属性
interface AutoInterFace extends Auto {}
// 实现 AutoInterFace接口
class C implements AutoInterFace {
  state = 1;
}

// Auto 的子类也可以实现  AutoInterFace接口
// 因为 Bus是 Auto 的子类,自然就继承了 state属性,因此不必重复实现
class Bus extends Auto implements AutoInterFace {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

接口抽离类成员的时候, 不仅抽离的公共成员,也抽离了私有成员和受保护成员

  • 接口之间是可以相互继承的,这样能够实现接口的复用
  • 类之间也可以相互继承,这样能够实现 方法和属性的复用
  • 接口是可以通过类来实现的,但是接口只能约束类的共有成员
  • 接口可以抽离出类的成员,这些成员包括(共有成员,私有成员,受保护成员)
沪ICP备20006251号-1