【问题标题】:Can You Specify Multiple Type Constraints For TypeScript Generics您可以为 TypeScript 泛型指定多个类型约束吗
【发布时间】:2013-06-12 02:56:44
【问题描述】:

我有一个像这个例子一样的通用接口,只有一个类型约束:

export interface IExample<T extends MyClass> {
    getById(id: number): T;
}

是否可以指定多个类型约束而不仅仅是一个?

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    Typescript 不提供为泛型类型获取多重继承的语法。但是,您可以通过使用 Union 类型和 Intersection 类型来实现类似的语义。在您的情况下,您需要一个交叉点:

    interface Example<T extends MyClass & OtherClass> {}
    

    对于两种类型的联合:

    interface Example<T extends MyClass | OtherClass> {}
    

    【讨论】:

    • 联合类型是实现此目的的好方法,因为您不需要为约束的唯一目的创建接口。它们在 2013 年不存在 - 但这绝对是我现在推荐的方式。
    • 这个答案是错误的。联合类型与扩展两种不同类型的语义完全不同。
    • @AlexG 当然这和扩展两种类型不一样,但和实现两种接口一样。
    • 另外请记住,Typescript 也支持交集类型。所以&lt;T extends MyInterfaceA &amp; MyInterfaceB&gt; 要求类型实现两个接口。
    • 据我了解 extends A|B 的语义是扩展 A 或 B,因为 extends A &amp; B 是扩展两者!所以也许你应该在你的答案中指定两者......
    【解决方案2】:

    解决此问题的方法是使用超级接口(这也回答了“为什么允许接口从类继承”的问题)。

    interface ISuperInterface extends MyClass, OtherClass {
    
    }
    
    export interface IExample<T extends ISuperInterface> {
        getById(id: number): T;
    }
    

    【讨论】:

    • 这是正确的解决方案。但是,从两个类扩展一个接口有点吓人——如果两者都声明私有成员,则该接口是无法实现的
    【解决方案3】:

    参考关于从类派生的接口的评论...名称中有什么?

    我在 0.9.0 规范的第 3.5 节中发现了这一点:

    接口声明只引入命名类型,而类 声明引入了命名类型和构造函数 创建这些命名类型的实现实例。被命名的 类和接口声明引入的类型只有次要的 差异(类不能声明可选成员和接口 不能声明私有成员)并且在大多数情况下 可互换。特别是,只有 public 的类声明 成员引入命名类型,其功能与创建的类型完全相同 通过接口声明。

    【讨论】:

    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多