# 定义
交叉类型
交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型, 它包含了所需的所有类型的特性。
Note: 交叉类型是 或 的关系, 即 &
运算符。如果两个类型中出现相同的key,但是类型不同,则该key为never。
# 使用
interface Boy {
handsome: boolean;
name?: string;
}
interface Girl {
cute: boolean;
name?: string;
}
// {
// cute: boolean;
// handsome: boolean;
// name?: never;
// }
type Person = Boy & Girl;
const someone: Person = {
handsome: true,
cute: false,
name: 'Rain120'
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
大多是在混入 (mixins)
或其它不适合典型面向对象模型的地方看到交叉类型的使用。如下示:
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();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 实现
interface IntersectionTypes {
assign<T, U>(target: T, source: U): T & U;
}
1
2
3
2
3
# 快来耍耍啊
# 🌰🌰
// template
1
# 游乐场
# 参考答案
// answer
1