条款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 同时可以表达一个类型时,我们一般是如何区分的呢。 首先,我们先理解一下两者的相似之处:
- 他们的报错基本一致;
- 都可以定义函数类型,但是使用 type 定义函数会更加的自然一些;
- 都可以接受泛型;
- 可以相互扩展
interface IStateWityPop extends TState {
pop: number
}
type TStateWithPop = IState & { pop: number };
不同点
- type 可以使用类型操作符,如 | 和 & 符号,而 interface 不能使用类型操作符;所以在扩展时,interface 可以使用 extends 操作符;
- type 可以定义基础类型或者字符串类型,如 type TA = 'abc',而 interface 不太好定义基础类型定义;
- type 更好定义元组类型;
- interface 可以被扩增,也就是所谓的声明合并,
什么是声明合并:
interface IState {
name: string;
age: string;
}
interface IState {
pop: number;
}
const a: IState {
name: '1',
age: '2',
pop: 3
}
主要用于类型声明文件,我们的类型生命中可能会缺少一些需要用户补充的属性,这时候用户就会使用生命合并;
常规的代码和声明都支持合并,如果你不想被合并,那么久使用 type
总结
- type 和 interface 的使用规范需要和项目规范保持一致;
- 我们需要理解其中的异同之处;