《Effective TypeScript 》-- 条款13: 了解 type 和 interface 的异同点

227 阅读1分钟

条款13: 了解 type 和 interface 的异同点

相同点

当我们想要定义一个复杂对象类型的时候,我们通常可以使用:

type TPerson = {
  name: string;
  age: string;
}

interface IPerson {
  name: string;
  age: string;
}

// 还可以使用  class 关键字引入一个类型,但是 class 更多是用于运行时的概念,这里我们不一起概述
class Person {
  name: string;
  age: string
}

所以当 type 和 interface 同时可以表达一个类型时,我们一般是如何区分的呢。 首先,我们先理解一下两者的相似之处:

  1. 他们的报错基本一致;
  2. 都可以定义函数类型,但是使用 type 定义函数会更加的自然一些;
  3. 都可以接受泛型;
  4. 可以相互扩展
interface IStateWityPop extends TState {
  pop: number
}

type TStateWithPop = IState & { pop: number };

不同点

  1. type 可以使用类型操作符,如 | 和 & 符号,而 interface 不能使用类型操作符;所以在扩展时,interface 可以使用 extends 操作符;
  2. type 可以定义基础类型或者字符串类型,如 type TA = 'abc',而 interface 不太好定义基础类型定义;
  3. type 更好定义元组类型;
  4. interface 可以被扩增,也就是所谓的声明合并,
什么是声明合并:
interface IState {
  name: string;
  age: string;
}

interface IState {
  pop: number;
}

const a: IState {
  name: '1',
  age: '2',
  pop: 3
}

主要用于类型声明文件,我们的类型生命中可能会缺少一些需要用户补充的属性,这时候用户就会使用生命合并;
常规的代码和声明都支持合并,如果你不想被合并,那么久使用 type

总结

  • type 和 interface 的使用规范需要和项目规范保持一致;
  • 我们需要理解其中的异同之处;