TS中的联合类型和交叉类型
前言
之前我们介绍了TS
的类型,今天来补充两个:联合类型和交叉类型
大约2
分钟看完,先来看交叉类型👇
交叉类型
其实一句话就能说明白:交叉类型是通过使用&
符号,将多个类型合并为一个类型
这意味着我们可以把之前说的类型,多个叠加在一起作为一种类型
举例一个官方的例子🌰:
function extend<T, U>(first: T, second: U): T & U {
let result = <T & U>{};
for (let id in first) {
(<any>result)[id] = (<any>first)[id];
}
for (let id in second) {
if (!result.hasOwnProperty(id)) {
(<any>result)[id] = (<any>second)[id];
}
}
return result;
}
class Person {
constructor(public name: string) { }
}
interface Loggable {
log(): void;
}
class ConsoleLogger implements Loggable {
log() {
// ...
}
}
var jim = extend(new Person("Jim"), new ConsoleLogger());
var n = jim.name;
jim.log();
上述代码是创建混入的一个简单例子,其中返回值类型是T & U
,这就是交叉类型
是不是很简单!
接下来再来看联合类型
联合类型
跟交叉类型有点相似,但又不同
相同点的是它也是用一个符号连接多个类型作为一个新类型
不同的是:
- 交叉类型用得连接符号是
&
,而联合类型用的是竖线|
分隔每个类型; - 而且表示的意思也不一样,联合类型表示一个值可以是几种类型之一,比如
number | string
表示一个值可以是number
或string
如果一个值是联合类型,我们只能访问此联合类型的所有类型里共有的成员,记住是共有成员哦!
还是举例官方的例子🌰:
interface Bird {
fly();
layEggs();
}
interface Fish {
swim();
layEggs();
}
function getSmallPet(): Fish | Bird {
// ...
}
let pet = getSmallPet();
pet.layEggs(); // okay
pet.swim(); // errors
上述代码,再次验证上面刚刚强调过的,只能访问共有成员,所以layEggs
可以访问,因为它是公共的,而swim
是Fish
独有的,所以不能访问!
END
以上就是本文的所有内容,如有问题,欢迎指正~
转载自:https://juejin.cn/post/7029577757575118861