序一:本来打算写“浅谈 Intersection Types 和 Union Types”的,后来考虑到前者的篇幅已经有点长了,就砍成了“浅谈 Intersection Types”,后半部分以后再谈。
序二:网上其实有挺多关于 intersection types (和 union types)的文章了,且大部分是以 TypeScript 为宿主语言进行说明的。不过那些文章比较侧重这两种类型在 TypeScript 中的使用方式,对这以外的知识鲜有说明,本文旨在弥补这一不足。
本文大量参考了《Programming with Intersection Types and Bounded Polymorphism》[1] 和 《Row and Bounded Polymorphism via Disjoint Polymorphism》[2],或者直接说翻译吧,更贴切些,毕竟也没有太多自己的原创研究。
Intersection
类型
Intersection
类型太长,后文一律简称 I
类型。
相信大家在生活中经常会看到 “既要……,且要……,还要……” 这样的句式,I
类型正是又一例证。
interface Fly {
void fly();
}
interface Swim {
void swim();
}
interface Run {
void run();
}
class C<T extends Fly & Swim & Run> {
T omni;
void test() {
omni.fly();
omni.swim();
omni.run();
omni.run();
omni.fly()