【问题标题】:TypeScript type parameter to implement multiple interfacesTypeScript 类型参数实现多个接口
【发布时间】:2015-10-08 00:55:44
【问题描述】:

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> { }

【问题讨论】:

    标签: generics interface typescript typescript1.5


    【解决方案1】:

    Intersection types 从 TS 1.6 开始就在这里,您可以在上面的示例中像这样使用它:

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

    【讨论】:

    • 这与扩展两个接口并不完全相同。但它适用于这些简单的情况,接口没有重叠。
    • @AlexG 你什么意思?为什么重叠接口会成为问题?
    • 使用 { a: number } & { a: string } 生成的类型将默默地与 { a: number & string } 相同,这与从两个不同的接口继承不同,其中 a冲突的属性会引发错误。
    • @AlexG 好的,我们在这里讨论两件不同的事情。在这种情况下,我们说 type 从其他类型扩展而来。 { a: number } & { a: string } 的交集类型显然和 { a: number & string } 是一样的,这里没什么奇怪的。但是,如果您在谈论类继承,那么我们当然会有冲突,但这在 TS 中永远不会发生,因为它没有多重继承。
    • 哦,还有一些歧义。您不从接口继承,而是实现它们。并且类实现{ a: number }{ a: string }没有冲突,你只需要确保类的成员a既是数字又是字符串(即交集类型数字和字符串)。
    【解决方案2】:

    遗憾的是,在 TS1.5 中,您可以这样做的唯一方法是声明一个扩展 A 和 B 的新接口。

    另一种选择是为即将到来的支持intersection type的TS1.6祈祷。

    【讨论】:

      猜你喜欢
      • 2019-06-27
      • 2018-09-15
      • 1970-01-01
      • 2013-01-11
      • 2022-01-22
      • 1970-01-01
      • 2021-02-21
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多