基础概念与语法介绍
extends
关键字主要用于类、接口和泛型中,分别实现继承
、扩展
和约束
功能。在类中,它允许一个类继承另一个类的属性和方法;在接口定义中,他用于合并接口,形成一个包含所有指定接口成员的新接口;而在泛型中,extends
用于限制类型变量必须符合某种类型结构,增加了泛型的灵活性和类型的安全性。
类的继承
类的继承是面向对象编程的基本特征之一,extends在此发挥了核心作用。通过继承、子类可以复用父类的属性和方法,同时可选择性的覆盖或扩展他们
typescript
class Animal {
name: string;
constructor(name: string){
this.name = name;
}
speak(){
console.log(`${this.name} is Animal`)
}
}
class Dog extends Animal {
speak(){
console.log(`${this.name} Dog`)
}
}
在这个例子中,Dog
类通过extends
继承了Animal
类,并覆盖了speak
方法以提供更具体的实现。
接口的扩展
接口扩展是TypeScript
中实现接口复用
和组合
的强大机制。利用extends
,可以创建一个接口,它包含一个或多个其他接口所有成员。
基本接口扩展
假设你有两个基本接口,一个描述了动物的一般特征,另一个专门描述了鸟类的特征。
typescript
interface Animal {
name: string;
age: number;
}
interface Brid extends Animal {
fly(): void;
sing(): string;
}
let brid: Brid = {
name: 'zyj',
age: 1,
fly() {
console.log('fly');
},
sing() {
return 'sing'
}
}
在这里,Bird
接口通过extends
关键字扩展了Animal
接口,这就意味着一个实现了Brid
接口的对象除了需要有fly
和sing
方法还必须有name
和age
属性。
多接口扩展
有时候一个类或接口可能需要符合多个接口的规范。TypeScript
支持多重继承,即一个接口可以扩展多个其他接口。
typescript
interface Swinmer {
swim(): void;
}
interface Flyer {
fly(): void;
}
interface Duck extends Swinmer, Flyer {
quack(): void;
}
let duck: Duck = {
swim() {
console.log('swim')
},
fly() {
console.log('fly')
},
quack() {
console.log('quack')
},
}
在上面的例子中,Duck
接口通过扩展Swimmer
和Flyer
接口,要求实现了Duck
的类型还需要有swim
和fly
方法,以及自己的quack
方法。
泛型接口与扩展
接口扩展也可以与泛型一起使用,为泛型类型增加更多约束或行为。
typescript
interface Loggable<T> {
log(message: T): void;
}
interface Identifiable<T> {
id: T;
}
interface User extends Identifiable<number>, Loggable<string> {
name: string;
email: string;
}
const user: User = {
id: 1,
name: 'zyj',
email: '123@qq.com',
log(message: string) {
console.log(message)
}
}
在这个例子中,User
接口不仅有自己的属性name
和email
,还通过扩展Identifiable<number>
获得了id
属性,并且通过扩展Loggable<string>
要求有一个接受字符串参数的log
方法。
我是菜逼,大佬勿喷!