TypeScript 中 interface 和 type 的区别

280 阅读2分钟

在 TypeScript 中,interfacetype 都用于定义类型,但它们有一些关键区别。今天我们就来详细对比它们的特性、使用场景和注意事项,帮你彻底掌握这两个核心概念!


核心区别对比表

特性interfacetype
扩展性支持 extendsimplements支持交叉类型(&
合并声明同名接口会自动合并同名类型会报错
适用场景定义对象形状、类实现复杂类型(联合、元组、条件类型等)
兼容性更适合面向对象编程更灵活,适合函数式编程
示例interface User { name: string }type User = { name: string }

详细解析

1. 扩展与继承

interface:通过 extends 扩展其他接口。

interface Person {
  name: string;
}
interface User extends Person {
  id: number;
}

type:通过交叉类型(&)扩展。

type Person = {
  name: string;
};
type User = Person & { id: number };

2. 合并声明

interface:同名接口会自动合并。

interface User { name: string; }
interface User { age: number; }
// 最终 User 包含 name 和 age

type:同名类型会报错。

type User = { name: string; };
type User = { age: number; }; // 报错:重复声明

3. 适用场景

interface 更适合

  • 定义对象的形状(如 API 响应)。

类的实现(implements)。

interface Animal {
  eat(): void;
}
class Dog implements Animal {
  eat() { console.log("Eating..."); }
}

type 更适合

定义联合类型、元组、条件类型等复杂类型。

// 联合类型
type Status = "success" | "error";
// 元组
type Point = [number, number];
// 条件类型
type IsString<T> = T extends string ? true : false;

4. 其他区别

type 可以定义原始类型

type ID = number | string

interface 可以声明类实例的类型

interface ClockInterface {
  currentTime: Date;
}
class Clock implements ClockInterface {
  currentTime: Date = new Date();
}

如何选择?

  • 默认情况下:优先使用 interface(更适合面向对象编程)。
  • 需要复杂类型时:使用 type(如联合类型、条件类型)。
  • 需要合并声明时:使用 interface

总结

场景推荐使用示例
定义对象形状interfaceinterface User { name: string }
类实现interfaceclass X implements Y {}
联合类型/复杂类型type`type ID = stringnumber`
需要合并声明interface同名接口自动合并