在 TypeScript 中,interface 与 type 都可以用来描述对象的形状,但它们之间存在一些关键区别:
interface:支持声明合并。你可以在多个地方声明同一个接口,TypeScript 会将它们合并成一个接口。例如:
interface Person { name: string; } interface Person { age: number; } // Person 合并后等同于 { name: string; age: number; }
type:不支持声明合并。重复声明同一个类型别名会报错。
interface:主要用于描述对象的结构(属性、方法等),适合面向对象的设计模式。
type:不仅可以描述对象,还可以定义联合类型、交叉类型、原始类型别名、元组等。例如:
type ID = number | string; type Coordinates = [number, number];
interface:可以通过 extends 关键字继承其他接口,支持接口的扩展和实现。
interface Animal { name: string; } interface Dog extends Animal { breed: string; }
type:虽然不能直接使用 extends,但可以通过交叉类型实现类似扩展的效果:
type Animal = { name: string }; type Dog = Animal & { breed: string };
如果主要用于定义对象的结构,并希望利用声明合并或面向对象的特性,建议使用 interface。
如果需要更强的表达能力,比如定义联合类型、元组等,或者希望用一种统一的方式描述多种类型,则可以选择 type。
总结来说,两者在描述对象时有很多相似之处,但 interface
更偏向于面向对象的设计和扩展,而 type
则在类型组合和别名方面更灵活。选择哪一个主要取决于你的具体需求和团队的编码风格。