type和interface区别
灵感胜于汗水 Lv5

定义类型范围

interface只能定义对象类型,而type声明可以声明任何类型,包括基础类型、联合类型、元组类型、交叉类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 基本类型 
type person = string

// 对象类型
interface Dog {
name: string;
}
interface Cat {
age: number;
}

// 联合类型
type animal = Dog | Cat

// 元组类型
type animal = [Dog, Cat]

扩展性

  • 接口可以extendsimplements扩展多个接口或类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// interface extends interface
interface Person {
name: string
}
interface User extends Person {
age: number
}

// interface extends type
type Person = {
name: string
}
interface User extends Person {
age: number
}
  • type可以使用交叉类型&,来使成员类型合并。
1
2
3
4
5
6
7
8
9
10
11
// type & type
type Person = {
name: string
}
type User = Person & { age: number }

// type & interface
interface Person {
name: string
}
type User = {age: number} & Person

合并声明

定义两个相同名称的接口会合并声明;而定义两个同名的type会出现异常。

1
2
3
4
5
6
7
8
9
10
11
interface Person { 
name: string
}
interface Person {
age: number
}
// 合并为:
// interface Person {
// name: string
// age: number
// }

映射类型

type 能使用 in 关键字生成映射类型,但 interface 不行。

1
2
3
4
5
6
7
8
9
10
type Keys = 'firstname' | 'surname';

type DudeType = {
[key in Keys]: string;
};

const test: DudeType = {
firstname: 'Pawel',
surname: 'Grzybek',
};

typeof

type可以使用typeof获取实例类型

1
2
let div = document.createElement('div');
type B = typeof div

默认导出方式

inerface 支持同时声明 和 默认导出;而type必须先声明后导出

1
2
3
export default interface Config {
name: string;
}
1
2
type Config2 = {name: string}
export default Config2
  • 本文标题:type和interface区别
  • 本文作者:灵感胜于汗水
  • 创建时间:2022-10-31 17:35:03
  • 本文链接:https://cjhsyc.github.io/2022/10/31/type和interface区别/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!