【发布时间】:2013-06-12 02:56:44
【问题描述】:
我有一个像这个例子一样的通用接口,只有一个类型约束:
export interface IExample<T extends MyClass> {
getById(id: number): T;
}
是否可以指定多个类型约束而不仅仅是一个?
【问题讨论】:
标签: typescript typescript-generics
我有一个像这个例子一样的通用接口,只有一个类型约束:
export interface IExample<T extends MyClass> {
getById(id: number): T;
}
是否可以指定多个类型约束而不仅仅是一个?
【问题讨论】:
标签: typescript typescript-generics
Typescript 不提供为泛型类型获取多重继承的语法。但是,您可以通过使用 Union 类型和 Intersection 类型来实现类似的语义。在您的情况下,您需要一个交叉点:
interface Example<T extends MyClass & OtherClass> {}
对于两种类型的联合:
interface Example<T extends MyClass | OtherClass> {}
【讨论】:
<T extends MyInterfaceA & MyInterfaceB> 要求类型实现两个接口。
extends A|B 的语义是扩展 A 或 B,因为 extends A & B 是扩展两者!所以也许你应该在你的答案中指定两者......
解决此问题的方法是使用超级接口(这也回答了“为什么允许接口从类继承”的问题)。
interface ISuperInterface extends MyClass, OtherClass {
}
export interface IExample<T extends ISuperInterface> {
getById(id: number): T;
}
【讨论】:
参考关于从类派生的接口的评论...名称中有什么?
我在 0.9.0 规范的第 3.5 节中发现了这一点:
接口声明只引入命名类型,而类 声明引入了命名类型和构造函数 创建这些命名类型的实现实例。被命名的 类和接口声明引入的类型只有次要的 差异(类不能声明可选成员和接口 不能声明私有成员)并且在大多数情况下 可互换。特别是,只有 public 的类声明 成员引入命名类型,其功能与创建的类型完全相同 通过接口声明。
【讨论】: