在 TypeScript 中,interface(接口)和type(类型别名)有以下一些不同点:
一、语法形式不同
interface:使用interface关键字来定义,语法格式如下:
interface Person {
name: string;
age: number;
}
type:通过type关键字定义,例如:
type Point = {
x: number;
y: number;
};
二、重复定义的处理方式不同
interface:接口可以进行重复定义,并且后续的定义会自动合并到之前的定义中。例如:
interface Animal {
name: string;
}
interface Animal {
age: number;
}
let dog: Animal = {
name: "旺财",
age: 3
};
type:类型别名不允许重复定义,重复定义同一个类型别名会直接报错,比如:
type Car = {
brand: string;
};
// 以下代码会报错,因为重复定义了Car类型别名
type Car = {
model: string;
};
三、实现与继承方面
interface:extends关键字进行扩展,实现类似继承的效果,要求类必须提供接口中定义的所有属性和方法(抽象类除外)。例如:
interface NameItf{
name:string,
}
interface AgeItf{
age: number
}
interface Person extends NameItf, AgeItf{
height:number
}
let info:Person = {
name: 'Lucy',
age: 16,
height: 163
}
type:类型别名本身不具备类似接口那样让类去实现的机制,不过可以通过交叉类型(&)等方式来模拟类似接口继承合并属性的效果,例如:
type Shape = {
getArea(): number;
};
type ColoredShape = Shape & {
color: string;
};
四、使用场景倾向
interface:
更适合用于定义对象的 “形状”,尤其是在面向对象编程中,当需要定义一组类需要遵循的规范(通过实现接口),或者对接口进行扩展来描述更具体的对象结构时非常方便,常用于公共 API 的定义等场景,方便代码的扩展和不同模块之间的协作遵循统一规范。
type:
适合创建一些复杂的类型组合、联合类型,或者对类型进行精确的别名定义来增强代码可读性(比如一些复杂的函数类型、交叉类型、联合类型等场景),在需要进行高级类型操作以及处理那些并非面向对象意义上的 “接口规范” 场景下使用更合适。