【TypeScript】TypeScript中 interface 和 type 的区别

在 TypeScript 中,interfacetype 都用于定义类型,但它们在设计目的和特性上有一些关键区别:

1. 核心区别

  • interface
    专门用于定义对象类型(包括函数、类、索引签名等)。强调“形状”(shape)描述,适合面向对象场景。
  • type
    类型别名(Type Alias),可为任意类型命名(包括对象、联合类型、元组、原始值等)。功能更通用。

2. 关键差异

特性 interface type
声明合并 ✅ 支持(同名的 interface 自动合并) ❌ 不支持(同名会报错)
扩展方式 extends 继承 & 交叉类型
实现(implements) 类可直接实现 interface 类可实现 type(但需是对象类型)
联合类型/元组等 ❌ 无法直接定义 ✅ 可直接定义(如 type A = B | C
映射类型/复杂运算 ❌ 不支持 ✅ 支持(如 keyof、条件类型等)
函数类型 可通过调用签名定义 可直接用箭头函数语法(如 () => void

3. 语法示例

扩展(Extend)

// interface 继承
interface Animal {
  name: string;
}
interface Dog extends Animal {
  bark(): void;
}

// type 交叉类型
type Animal = { name: string };
type Dog = Animal & { bark(): void };

联合类型(Union)

// type 支持联合类型
type ID = string | number;
// interface 无法直接定义联合类型

声明合并

// interface 自动合并
interface User { name: string; }
interface User { age: number; }
const user: User = { name: "Alice", age: 30 }; // ✅ 合并生效

// type 会报错
type User = { name: string };
type User = { age: number }; // ❌ Error: Duplicate identifier 'User'

复杂类型运算

// type 支持条件类型、映射类型等
type Keys = "name" | "age";
type User = {
  [K in Keys]: string; // 映射类型
};

// interface 无法实现此类操作

4. 使用建议

  • 优先用 interface 的场景
    • 定义对象类型(尤其是需要声明合并时)。
    • 类实现(implements)或库的类型扩展(如为第三方库添加新属性)。
  • 优先用 type 的场景
    • 需要定义联合类型、元组、函数类型等非对象类型。
    • 需要复杂类型操作(如条件类型、映射类型)。
    • 一次性使用的类型别名。

总结

维度 interface type
设计目的 描述对象形状(OOP 友好) 为任意类型创建别名(灵活通用)
灵活性 较低(专注对象结构) 较高(支持所有类型和运算)
扩展性 ✅ 声明合并、extends 继承 ✅ 交叉类型(&
适用场景 公共 API、类实现、第三方类型扩展 联合类型、复杂类型运算、临时类型

实践中:两者在对象类型定义上功能高度重叠,可根据团队规范选择。大型项目建议多用 interface(更清晰易扩展),复杂类型逻辑用 type 补充。

posted @ 2025-06-23 20:01  unuliha  阅读(216)  评论(0)    收藏  举报