当一个对象类型被多次使用时,一般会使用接口(interface)来描述对象的类型,达到复用的目的
示例如下
当一个对象类型被多次使用时,可以看到,很明显代码有大量的冗余
let personTom: { name: string, age?: number, sayHi(name: string): void } = {
name: 'Tom',
sayHi(name: string) {
console.log(`Hi, ${name}`)
}
}
let personJack: { name: string, age?: number, sayHi(name: string): void } = {
name: 'Tom',
sayHi(name: string) {
console.log(`Hi, ${name}`)
}
}
这个时候可以将这个对象定义为接口,以进行复用,可以看到,这样代码就少了很多冗余
interface Person {
name: string
age?: number
sayHi(name: string): void
}
let personTime: Person = {
name: 'time',
sayHi(name: string) {
console.log(`hello ${name}`)
}
}
let personJohn: Person = {
name: 'John',
sayHi(name: string) {
console.log(`hello ${name}`)
}
}
在 TypeScript中,interface和type都可以用来定义类型的别名
interface(接口)和type(类型别名)的对比
代码示例
interface Person {
name: string
age?: number
sayHi(name: string): void
}
type animal = {
name: string
age?: number
sayHi(name: string): void
}
如果两个接口之间有相同的属性或方法,可以将公共的属性或方法,抽离出来,通过继承来实现复用
比如,这两个接口都有x,y两个属性,重复写两次,可以,但是很繁琐
interface Point2D { x: number, y: number }
interface Point3D { x: number, y: number, z: number }
这个时候就可以使用extends继承来让Point3D 继承Point2D 就可以省去x和y的定义了
如下
interface Point2D { x: number, y: number }
// interface Point3D { x: number, y: number, z: number }
interface Point3D extends Point2D { z: number }
tips:
先看下面这个例子
interface Animal {
name: string;
age: number;
sound: () => void;
}
interface Dog extends Animal {
breed: string;
}
let myDog: Dog = {
name: "Rex",
age: 3,
breed: "German Shepherd",
sound: () => console.log("Bark!")
};
在这个例子中,Dog 接口继承了 Animal 接口。这意味着,Dog 对象必须包含 Animal 接口定义的所有属性和方法,也就是 name、age 和 sound。然后,Dog 接口还定义了自己的额外属性,即 breed。
这是一个很有意思的现象,因为这已经是静态类型语言才能实现多态的基础了
如上在 TypeScript 中,接口继承可以实现多态性。如果你有一个函数接受 Animal 类型的参数,那么你也可以传入一个 Dog 类型的参数,因为 Dog 是 Animal 的子类型。这是基于 Liskov 替换原则,也就是子类型必须能够替换它们的基类型。
原理有了,开始实现
//定义基类
interface Animal {
name: string;
age: number;
sound: () => void;
}
//定义基础
interface Dog extends Animal {
breed: string;
}
let myDog: Dog = {
name: "Rex",
age: 3,
breed: "German Shepherd",
sound: () => console.log("Bark!")
};
//实现多态
function polymorphicDisplay(a: Animal) {
a.sound();
}
polymorphicDisplay(myDog);