这是我参与「第五届青训营 」笔记创作活动的第12天
2.2.5 交叉类型
交叉类型(&):功能类似于接口继承(extends),用于组合多个类型为一个类型(常用于对象类型)
interface Person { name: string }
interface Contact { phone: string }type PersonDetail = Person & Contact
let obj: PersonDetail = {
name: 'jack',
phone:'133...
}
使用交叉类型后,新的类型PersonDetail就同时具备了Person和Contact的所有属性类型。相当于
type PersonDetail = { name: string; phone: string }
交叉类型(&)和接口继承(extends)的对比:
- 相同点:都可以实现对象类型的组合。
- 不同点:两种方式实现类型组合时,对于同名属性之间,处理类型冲突的方式不同。
interface A {
fn:(value: number) => string
}
interface B extends A {
fn: (value: string) => string
}
interface A {
fn:(value: number)=> string
}
interface B {
fn:(value: string) => string
}
type C = A & B
以上代码,接口继承会报错(类型不兼容);交叉类型没有错误,可以简单的理解为:
fn: (value: string | number) => string
2.2.6 泛型
泛型是可以在保证类型安全前提下,让函数等与多种类型一起工作,从而实现复用,常用于:函数、接口、class中。
需求:创建一个id函数,传入什么数据就返回该数据本身(也就是说,参数和返回值类型相同)
function id(value: number): number { return value }
比如,id(10)调用以上函数就会直接返回10本身。但是,该函数只接收数值类型,无法用于其他类型。 为了能让函数能够接受任意类型,可以将参数类型修改为any。但是,这样就失去了TS的类型保护,类型不安全。
function id(value: any): any { return value }
泛型在保证类型安全(不丢失类型信息)的同时,可以让函数等与多种不同的类型一起工作,灵活可复用。 实际上,在C#和Java等编程语言中,泛型都是用来实现可复用组件功能的主要工具之一。