您可以为TypeScript Generics指定多个类型约束

Fen*_*ton 67 typescript typescript-generics

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

export interface IExample<T extends MyClass> {
    getById(id: number): T;
}
Run Code Online (Sandbox Code Playgroud)

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

STO*_*STO 70

在支持联合类型的typescript中,它是可能的

interface Example<T extends MyClass & OtherClass> {}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是对的.联合类型与扩展两个不同类型的语义不同. (5认同)
  • 另请注意,Typescript也支持交集类型.所以`<T扩展MyInterfaceA和MyInterfaceB>`要求类型实现两个接口. (4认同)
  • 联合类型是实现此目的的一种很好的方法,因为您不需要为约束的唯一目的创建接口.它们在2013年并不存在 - 但这绝对是我现在推荐的方式. (3认同)
  • @AlexG当然这与_extending_两种类型不同,但与_implementing_两个接口相同. (3认同)
  • 据我了解`extends A|B`的语义是extends A OR B,因为`extends A &amp; B`是extend both!所以也许你应该在你的答案中指定两者...... (2认同)

Fen*_*ton 29

解决这个问题的方法是使用超级接口(它还回答了"为什么你允许接口从类继承"的问题).

interface ISuperInterface extends MyClass, OtherClass {

}

export interface IExample<T extends ISuperInterface> {
    getById(id: number): T;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的解决方案.从两个类扩展接口有点可怕 - 如果两者都声明私有成员,那么接口是无法填充的 (10认同)