11. 接口 vs 抽象类
约 1126 字大约 4 分钟
2025-05-14
以下是 TypeScript 中接口(Interface)与抽象类(Abstract Class)的核心区别总结整理:
维度 | 接口(Interface) | 抽象类(Abstract Class) |
---|---|---|
定义方式 | interface 关键字 | abstract class 关键字 |
实例化能 | 不能实例化 | 不能直接实例化 |
方法实现 | 仅声明方法签名 | 可包含无实现的抽象方法和有实现的具体方法 |
成员变量 | 仅包含实例变量、常量 | 可包含实例变量、静态变量、常量等 |
构造函数 | 无构造函数 | 可以有构造函数 |
继承 | 可以多继承,继承类、接口、对象类型 | 只能单继承,继承类、构造函数 |
实现 | 可以被类实现 | 只能通过被类继承去实现 |
访问修饰符 | 默认只包含 public 成员 | 支持 public 、protected 、private |
静态成员 | 不包含 | 可包含静态方法和静态属性 |
设计目的 | 描述对象结构/行为契约 | 提供通用基类模板 |
💡 关键场景差异(附典型用途):
1. 接口适用场景
- 定义对象形状(如 API 响应结构)
- 声明跨类共享的能力(如 Serializable 接口)
- 替代多重继承(通过 implements 组合多个接口)
2. 抽象类适用场景
- 封装通用逻辑(如基础 CRUD 方法的默认实现)
- 强制子类实现核心方法(如抽象方法 render())
- 构建类层次结构(如 Animal → Cat/Dog)
⚙️ 代码示例对比:
// ✅ 接口:仅定义契约
interface Drawable {
draw(): void; // 抽象方法声明
}
// ✅ 抽象类:包含实现与抽象方法
abstract class Shape {
protected color: string; // 成员变量
constructor(color: string) {
this.color = color;
} // 构造器
abstract getArea(): number; // 抽象方法
public display(): void {
// 具体方法
console.log(`Color: ${this.color}`);
}
}
// 类实现接口并继承抽象类
class Circle extends Shape implements Drawable {
constructor(color: string, public radius: number) {
super(color);
}
getArea(): number {
return Math.PI * this.radius ** 2;
}
draw(): void {
console.log("Drawing circle...");
}
}
说明 :
Shape 抽象类提供 color 属性和 display() 默认实现,强制子类实现 getArea() Drawable 接口独立声明绘图能力,可被任意类实现(如 Circle)
📌 总结建议:
选择依据 | 推荐方式 |
---|---|
需要多态继承或代码复用 | ✅ 用抽象类(extends) |
定义轻量级契约或组合多个行为 | ✅ 用接口(implements) |
既需复用代码又需描述对象结构 | 🔄 组合使用(如上例) |
设计提示:优先用接口描述行为,用抽象类封装通用逻辑,避免过度耦合。
type IUser = {
name: string;
age: number;
};
class aaa implements IUser {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
1、类型别名 Type
- 类型别名可以用来定义任意类型、类型组合,也叫起别名。
- type 只能被继承,不能继承其他类型,只能通过交叉类型来实现扩展。
- type 可以被类实现,不能实现其他类型。
- type 不允许重复定义,会报错。
- type 不允许重名,会报错。
2、接口 Interfaces
- 接口只能用来描述对象、数组、函数、构造函数的类型。
- 接口可以继承接口、type、类,只保留成员定义,不保留具体实现。
- 接口只能被实现。
- 接口允许重复定义,会被合并成一个接口。
- 接口允许重名,和接口重名的接口会被合并成一个接口,和类重名的类会被合并到类里。
3、类 class
类只可以用作实例对象的类型。
类可以继承类、构造函数。
类可以实现接口、type 定义的类型。
类不允许重复定义,会报错。
类允许和接口重名,会将接口合并到类里。
类只能单继承,但是可以被多继承。
接口用来描述对象的结构和方法。
接口可以用来描述变量、函数入参的具体约束。
接口可以被类实现,实现接口的类必须实现接口中定义的所有属性和方法。
接口可以继承其他接口,实现多继承的效果。
接口可以继承类的成员定义,但是不能继承类的具体实现
接口可以继承接揭露
2、类(Classes)
- 类可以继承类:一个类只能继承一个类,
- 类不可以继承接口
- 类不可以继承对象
- 类可以实现接口
- 一个类可以实现多个接口
更新日志
2025/8/24 08:17
查看所有更新日志
e7112
-1于