这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
接上一篇:TypeScript实例讲解(十九)
本篇内容:TypeScript 交叉类型。
复制代码
交叉类型
TypeScript 为声明类型提供了更高级的选项,比如前面讲解过的联合类型(Union Types)以及今天要讲解的交叉类型(Intersection Types)。
交叉类型是将多个类型合并为一个新的类型。交叉类型使用与号 (&
) 分隔每种类型。
// 例 1
interface Person {
name: string
age: number
}
interface Teacher {
subject: string
}
type TeacherType = Person & Teacher;
const teacher: TeacherType = {
name: 'bear',
age: 30,
subject: 'mathematics'
}
复制代码
交叉类型最常见与接口一起使用。例1定义了两个接口 Person
和 Teacher
,它们各自定义了不同的成员。然后新建了一个名称为 TeacherType
的交叉类型,该交叉类型将两个接口中的成员组合在一起。对象 teacher
使用了 TeacherType
,因此它同时拥有了 Person
和 Teacher
这两种类型的成员。
注意:交叉类型不是取交集,而是取并集。
// 例 2
const teacher: Person & Teacher = {
name: 'bear',
age: 30,
subject: 'mathematics'
}
复制代码
例1也可以写成例2的形式。
成员冲突处理
// 例 3
interface Person {
name: string
age: number
}
interface Teacher {
subject: string
age: string
}
const teacher: Person & Teacher = {
name: 'bear',
age: 30, // 提示错误:
subject: 'mathematics'
}
复制代码
例3 Person
和 Teacher
两个接口都包括 age
成员,但它们的类型不一致。这里这种冲突的属性也会变成交叉类型,例3的属性 age
会变为:number & string
,实际上这种类型是不存在的,所以最后 age
的类型为 never
。如果给 age
赋值则提示错误:Type 'number' is not assignable to type 'number & string'
。
注意:如果类型之间有交集则无法合并。
never 类型
在 TypeScript 中 never
类型代表从来不会出现的值的类型。 never 是任何类型的子类型,never 类型可分配给每种类型,但是没有类型可以分配给 never(除了它本身)。
// 例 4
const error = function(): never {
throw new Error('出错了')
}
复制代码
使用场景:抛出异常。
交叉类型与联合类型
交叉类型和联合类型是不一样的。交叉类型可以访问所有类型的属性;联合类型只能访问所有类型的共有属性。
本篇完!如果文章对你有一点点帮助,请记得点个赞哦。