# 定义

交叉类型

交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型, 它包含了所需的所有类型的特性。

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

大多是在混入 (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

# 实现

interface IntersectionTypes {
	assign<T, U>(target: T, source: U): T & U;
}
1
2
3

# 快来耍耍啊

# 🌰🌰

// template
1

# 游乐场


# 参考答案

// answer
1

# 参考资料

handbook - intersection-types (opens new window)

数学公式参考 (opens new window)