TypeScript 交叉类型教程
发布时间:2023-03-30 14:00:54 所属栏目:教程 来源:
导读:本节介绍交叉类型的语法和应用,跟数学集合里的相交不一样,TypeScript 的交叉类型并不是指每个类型的交集,& 的意思理解成 and ,A & B 表示同时包含 A 和 B 的结果。
交叉类型是将多个类型合并为一个类型。
交叉类型是将多个类型合并为一个类型。
本节介绍交叉类型的语法和应用,跟数学集合里的相交不一样,TypeScript 的交叉类型并不是指每个类型的交集,& 的意思理解成 and ,A & B 表示同时包含 A 和 B 的结果。 交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。 语法为:类型一 & 类型二。 先来看一个简单示例: interface Admin { id: number, administrator: string, timestamp: string } interface User { id: number, groups: number[], createLog: (id: number) => void, timestamp: number } let t: Admin & User t!.administrator // 合法 Admin.administrator: string t!.groups // 合法 User.groups: number[] t!.id // 合法 id: number t!.timestamp // 合法 timestamp: never 代码解释: 交叉类型 Admin & User 包含了原类型的所有属性,但是要注意两个接口都拥有 id 和 timestamp 属性,且 id 类型相同,timestamp 类型不同。在此交叉类型中,timestamp 属性类型冲突,不可被赋值。 我们大多是在混入(Mixins)或其它不适合典型面向对象模型的地方看到交叉类型的使用。下面是合并两传入对象的成员属性的例子: function extend<T, U>(first: T, second: U): T & U { for(const key in second) { (first as T & U)[key] = second[key] as any } return first as T & U } 函数返回结果的类型是两个对象的交叉类型。调用 extend 函数,实现两个对象的合并: class Person { constructor(public name: string) { } } class ConsoleLogger { log() {} } let jim = extend(new Person('Jim'), new ConsoleLogger()) let n = jim.name jim.log() 代码解释: 通过 extend() 函数合并了两个类的实例,我们知道交叉类型是 and 的意思,那么合并后即可访问 Person 类实例的 name 属性,也可以调用 ConsoleLogger 类实例的 log() 方法。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐