106

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

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

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

4

3 回答 3

122

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

interface Example<T extends MyClass & OtherClass> {}

对于两种类型的联合:

interface Example<T extends MyClass | OtherClass> {}
于 2016-08-11T08:47:00.267 回答
40

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

interface ISuperInterface extends MyClass, OtherClass {

}

export interface IExample<T extends ISuperInterface> {
    getById(id: number): T;
}
于 2013-06-15T16:43:05.303 回答
1

参考关于从类派生的接口的评论......名字是什么?

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

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

于 2013-06-15T20:12:00.107 回答