持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
官方文档
An interface can be named in an extends or implements clause, but a type alias for an object type literal cannot.
An interface can have multiple merged declarations, but a type alias for an object type literal cannot.
意会有困难?我们往下看~
相同点
都可以描述一个对象或者函数
interface
interface User {
name: string
age: number
}
interface SetUser {
(name: string, age: number): void;
}
type
type User = {
name: string
age: number
};
type SetUser = (name: string, age: number): void;
不同点
1. 拓展(extends)与 交叉类型(Intersection Types):
interface 可以 extends, 但 type 是不允许 extends 和 implement 的,但是type可以通过交叉类型实现extend的类型扩展行为。即 interface 可以 extends type, type 也可以 与 interface 类型 交叉 。
二者对类型的扩展方法不同,但可以相互兼容使用。对 type 的类型扩展,并不叫 extend 而是类型合并。type 关键字的产生的东西官方有一个名字 type aliases ,就是类型别名,重点是它是别名不是而真正的类型。
四种实现:
interface extends interface
interface Name {
name: string;
}
interface User extends Name {
age: number;
}
interface extends type
type Name = {
name: string;
}
interface User extends Name {
age: number;
}
type 与 type 交叉
type Name = {
name: string;
}
type User = Name & { age: number };
type 与 interface 交叉
interface Name {
name: string;
}
type User = Name & {
age: number;
}
2. type 可以干的而 interface 不行:
type 可以声明基本类型别名,联合类型,元组等类型
// 基本类型别名
type Name = string
// 联合类型
interface Dog {
wong();
}
interface Cat {
miao();
}
type Pet = Dog | Cat
// 具体定义数组每个位置的类型
type PetList = [Dog, Pet]
type 语句中还可以使用 typeof 获取实例的 类型进行赋值
// 当你想获取一个变量的类型时,使用 typeof
let div = document.createElement('div');
type B = typeof div
3. interface 可以而 type 不行:
interface 能够合并声明
interface User {
name: string
age: number
}
interface User {
sex: string
}
/*
User 接口为 {
name: string
age: number
sex: string
}
*/
总结一下
两者都是为了告诉编译器,如何理解某个字段的结构类型:
- interface 是一种关系结构的描述,里面可以包含属性和方法,可派生。
- type 是一种表达式,所以也可以说是一种aliase,可以使用一些表达式的操作符,并且通过这些操作符实现和interface近似等价的关系描述。
- 在对象扩展情况下,interface 使用 extends 关键字,而 type 使用交叉类型(&)。
- 同名的 interface 会自动合并,并且在合并时会要求兼容原接口的结构。
- interface 与 type 都可以描述对象类型、函数类型、Class 类型,但 interface 无法像 type 那样表达元组、一组联合类型等等。
- interface 无法使用映射类型等类型工具,也就意味着在类型编程场景中我们应该使用 type 。
参考: