1. type:创建类型别名,不仅可以用来表示基本类型,还可以表示对象类型,联合类型,元组和交集
type username = string //基本类型
type userId = string | number //联合类型
type arr = number[]
//对象类型
type Person = {id:userIdname:userNameage:number
}
//泛型
type Tree = { value:T };
const user: Person = {id :'fd',
}
2. 接口是命名数据结构(例如对象)的另一种方法;与Type不同,Interface仅限于描述对象类型
接口的声明语法也不同类型别名的生命语法,让我们将上面的类型别名 Person
重写为接口声明:
interface Person{id:userIdname:userNameage:number
}
两种相似之处:
都可以描述Object 和Function
,但语法不同
type:type Point = {x: number;y: number;
};
type SetPoint = (x: number, y: number) => void;
interfaceinterface Point {x: number;y: number;
}
interface SetPoint {(x: number, y: number): void;
}
interface
和 type
都可以继承。
另一个值得注意的是,接口和类型别名并不互斥。类型别名可以继承接口,反之亦然。只是在实现形式上,稍微有些差别。
二者区别
type
可以定义基本类型别名, 但是interface
无法定义
type
可以声明联合类型, 但是interface
无法定义
type可以声明 元组类型:但是interface
无法定义
interface 可以声明合并,但是type
无法定义,用type会报错 如果你多次声明一个同名的接口,TypeScript 会将它们合并到一个声明中,并将它们视为一个接口。这称为声明合并
总结
官方推荐用 interface
,其他无法满足需求的情况下用 type
。
但其实,因为 联合类型 和 交叉类型 是很常用的,所以避免不了大量使用 type
的场景,一些复杂类型也需要通过组装后形成类型别名来使用。
所以,如果想保持代码统一,还是可选择使用 type
。通过上面的对比,类型别名 其实可涵盖 interface
的大部分场景。
对于 React 组件中 props
及 state
,使用 type
,这样能够保证使用组件的地方不能随意在上面添加属性。如果有自定义需求,可通过 HOC二次封装。
编写三方库时使用interface
,其更加灵活自动的类型合并可应对未知的复杂使用场景。