TypeScript类型参数实现多个接口

14

C#中,我可以这样做:

class Dictionary<TKey, TVal> where TKey : IComparable, IEnumerable { }

TypeScript 1.5 beta中,是否有一种方法可以让泛型类或函数的类型参数实现多个接口,而无需为此创建全新的接口?由于逗号的歧义,显然常规方法无法正常工作。

class Dictionary<TKey extends IComparable, IEnumerable, TValue> { }

顺便说一下,有趣的是,在泛型中,extends 可以完美地处理接口联合:

class Dictionary<TKey extends IComparable|IEnumerable, TValue> { }
2个回答

24

交叉类型自TS 1.6起已经可用,您可以在上面的示例中像这样使用:

class Dictionary<TKey extends IComparable & IEnumerable, TValue> { }

这并不完全等同于扩展两个接口。但在这些简单的情况下,它是有效的,其中接口没有重叠部分。 - AlexG
@AlexG 你是什么意思?重叠接口会有什么问题吗? - Alex
使用 { a: number } & { a: string },结果类型将会悄无声息地与 { a: number & string } 相同。这与从两个不同的接口继承不同,其中冲突的属性会引发错误。 - AlexG
3
@AlexG 好的,我们在讨论两件不同的事情。在这种情况下,我们说类型是从其他类型扩展而来的。*{ a: number } & { a: string }* 的交集类型显然与 { a: number & string } 相同,没有任何奇怪之处。但是如果你谈论的是类继承,那么当然会有冲突,但在TS中永远不会发生这种情况,因为它没有多重继承。 - Alex
2
哦,还有一些不确定的地方。你不能从接口继承,只能实现它们。而且一个类实现 { a: number }{ a: string } 并不会产生冲突,你只需要确保类的成员a既是数字又是字符串(这就是交叉类型 number & string)。 - Alex
一个接口可以扩展多个其他接口。 - Rene Wooller

2
在TS1.5中,唯一的方法是声明一个新接口,该接口扩展A和B,可惜了。
另一个选择是祈求即将到来的TS1.6支持交集类型

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接