TypeScript 核心概念:`type` vs `interface`

在 TypeScript 中,type 和 interface 是定义类型约束的两大基石。它们功能高度重叠,常让开发者困惑:究竟该用哪个?理解它们的细微差异最佳适用场景至关重要。

核心相似点:定义形状

两者都能描述对象结构:

interface PersonInterface {
   
    name: string;
    age: number;
}

type PersonType = {
   
    name: string;
    age: number;
};
 
 

关键差异:能力与意图

  1. 扩展性 (extends vs &):

    • interface 使用 extends 继承:
      interface Employee extends PersonInterface {
             
          jobTitle: string;
      }
       
       
    • type 使用交叉类型 &
      type Employee = PersonType & {
              jobTitle: string };
       
       
  2. 声明合并 (Declaration Merging):

    • interface 的独有能力:同名的 interface 声明会自动合并。
      interface User {
              name: string; }
      interface User {
              age: number; }
      // 最终 User 是 { name: string; age: number; }
       
       
    • type 不允许重复定义。同名 type 会报错。
  3. 表达能力范围:

    • type 更灵活,能定义任何类型
      • 联合类型: type ID = string | number;
      • 元组类型: type Point = [number, number];
      • 映射类型: type Readonly<T> = { readonly [K in keyof T]: T[K]; }
      • 条件类型: type NonNullable<T> = T extends null | undefined ? never : T;
    • interface 主要描述对象形状(也可扩展函数、索引签名等)。
  4. 实现 (implements):

    • 类可以实现 (implements) 一个 interface 或一个表示对象形状的 type
      class Student implements PersonType {
              ... } // 或 PersonInterface
       
       

最佳实践:何时选择?

  1. 优先使用 interface 当:

    • 定义对象结构(尤其是公共 API 契约,如库的导出)。
    • 需要利用声明合并(扩展第三方库类型、环境声明)。
    • 需要清晰的面向对象继承 (extends)。
  2. 优先使用 type 当:

    • 定义非对象类型(联合、元组、函数类型、复杂映射/条件类型)。
    • 需要组合多个类型& 操作符非常直接)。
    • 定义的类型不需要声明合并,且更倾向于单一精确来源。
posted @ 2025-10-19 12:11  alloutlove  阅读(2)  评论(0)    收藏  举报