# 一句话总结:TS 何时选择 interface 或 type


interface 描述类型的结构,用 type 描述类型关系


有点编程基础中数据结构算法的味道。

结构即是类型的属性集合

// 如 `Point3D` 的属性集合: `x, y, z`。
interface Point3D {
  x: number;
  y: number;
  z: number;
}

关系可以是类型结构(属性集合)计算的算法(子集、并集、交集...),或是类型计算后的结果

// 求子集算法
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};

// type 描述关系:Point2D 是 Point3D 的子集
type Point2D = Pick<Point3D, 'x' | 'y'>

interface、type 两者能描述很多相同的场景,所以有时会陷入选择困难;
大部分场景需要一个定性思维,快速选择不犹豫,即上文总结;

了解两者的细节区别也是有必要的,若有兴趣可继续阅读 interface 与 type 区别介绍 (opens new window)

interface 和 type 很像,很多场景两者都能使用,但也有细微的差别

  • 类型:对象、函数两者都适用,但是 type 可以用于基础类型、联合类型、元组。
  • 同名合并:interface 支持,type 不支持。
  • 计算属性:type 支持, interface 不支持。

编程语言模型来理解 TS,可以阅读作者的另一篇文章系统化学习 TS 类型系统 (opens new window)


特殊的继承关系

由于面向对象思想已成为编程常识,TS 语言提供了 extends 关键字来描述继承关系(特殊的并集关系),所以许多人认为类型继承场景应该使用 interface ... extends ...

interface Point2D {
  x: number;
  y: number;
}

// 继承
interface Point3D extends Point2D {
  z: number;
}

// 并集
type Point3D = Point2D & { z: number }