TypeScript实例讲解(二十)

这是我参与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定义了两个接口 PersonTeacher,它们各自定义了不同的成员。然后新建了一个名称为 TeacherType 的交叉类型,该交叉类型将两个接口中的成员组合在一起。对象 teacher 使用了 TeacherType,因此它同时拥有了 PersonTeacher 这两种类型的成员。

注意:交叉类型不是取交集,而是取并集。

// 例 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 PersonTeacher 两个接口都包括 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('出错了')
}
复制代码

使用场景:抛出异常。

交叉类型与联合类型

交叉类型和联合类型是不一样的。交叉类型可以访问所有类型的属性;联合类型只能访问所有类型的共有属性。

本篇完!如果文章对你有一点点帮助,请记得点个赞哦。

猜你喜欢

转载自juejin.im/post/7032654068539457572
今日推荐