相同点
- 都可以描述一个对象或函数
<!-- interface定义 -->
interface User {
name: string,
age: number
}
<!-- type定义 -->
type User = {
name: string,
age: number
}
- 拓展和交叉属性
interface可以使用extends继承,type需要使用&进行连接
interface 继承interface
interface A {
age: number
}
interface B extends A{
name: string
}
// B继承A定义的属性 ==> {name: string, age: number}
type 继承 type
type A = {
name: string
}
type B = A & {
age: number
}
// B = A定义 + B本身定义的属性
// B = {name: string, age: number}
interface 继承 type
type A = {
name: string
}
interface B extends A{
age: number
}
// interface定义的B继承type定义的A定义的属性 ==> {name: string, age: number}
type 继承 interface
interface A = {
name: string
}
type B = A & {
age: number
}
// type定义的B继承interface定义的A定义的属性 ==> {name: string, age: number}
不同点
- type可以,interface不支持
- type可以声明基本类型别名、联合类型、元组等类型
// 基本类型别名
type Name = string
interface Dog {
color: string
}
interface Cat {
age: number
}
// 联合类型
type Pet = Dog | Cat
// 具体定义数组每个位置的类型
type PetList = [Dog, Cat]
- type语句中可以使用typeof获取实例的类型进行赋值
let div = document.createElement('div')
type Div = typeof div
- type中可以使用 in 关键字
type Keys = 'firstname' | 'surname'
type DudeType = {
[key in Keys]: string
}
const test: DudeType = {
firstname: '张',
surname: '小明'
}
- 其他操作方式
type StringOrNumber = string | number
type Text = string | { text: string }
type NameLoop = Dictionary<T>
type Callback<T> = (data: T) => void
type Pair<T> = [T, T]
type Coordinates = Pair<number>
type Tree<T> = T | { let: Tree<T>, right: Tree<T> }
- interface可以,type不支持
- 声明合并
interface User {
name: string,
age: number
}
interface User {
sex: string
}
// User接口最终为 所有User结合
{
name: string,
age: number,
sex: string
}
- interface支持同时声明,默认导出
// interface
export default interface interfaceConfig {
name: string
}
// type 需要先声明,后导出
type typeConfig = {
name: string
}
export default typeConfig
interface可以重复声明,最终会合并在一起,type只能声明一次
摘自文章答复:
两者都是为了告诉编译器,如何理解某个字段的结构类型
但两者的定义和使用场景还是有区别的:
interface 是一种关系结构的描述,里面可以包含属性和方法,可派生
type 是一种表达式,所以也可以说是一种aliase,可以使用一些表达式的操作符,并且通过这些操作符实现和interface近似等价的关系描述
所以,在描述带关系的数据结构时,interface应该优先于type被考虑,甚至可以简化思考,直接上interface。
而type在一定程度上简化类型描述,例如,type StrOrNum = string | number,后面都可以复用StrOrNum去代表string | number,
如果在一个类型描述文件里,string | number这样的类型字段比较多,就可以用type去精简内容。