使用打字稿界面和抽象类,无需指定泛型

时间:2019-09-08 14:42:03

标签: typescript typescript-generics

我已经按照以下方式创建了一个接口和抽象类:

interface ITest<A, B> {
    testFunc: (input: A) => B;
}

abstract class AClass<A, B> {
    abstract testFunc: (input: A) => B;
}

我有多个扩展AClass的子类和多个使用ITestA的各种类型实现B的对象。例如:

class SubClass1 extends AClass<number, string> {...}
class SubClass2 extends AClass<string[], boolean> {...}

对于抽象类或接口,我假设我可以声明无需特定泛型类型参数即可容纳这些类型的变量,因为我只希望它成为AClass的实例,而无需考虑泛型类型,如下所示:

let aClass: AClass; // Could hold SubClass1 or SubClass2
let iTests: ITest[];

但是我收到一条错误消息,说我的泛型类型需要两个类型参数。唯一的解决方法是设置默认类型参数和/或使用any作为其通用类型参数(例如ITest<any, any>[])声明这些变量吗?

1 个答案:

答案 0 :(得分:1)

您将使用aClassiTests所指的任何具体类型。如果他们要在不同的时间引用不同的类型,那么您将使用一个联合列出它们可能引用的类型。例如,如果aClass可能需要引用SubClass1的实例或SubClass2的实例,则:

let aClass: SubClass1 | SubClass2;

any, any是最坏的情况,您根本不知道具体的类型是什么。

您说过您有10多个。如果您确实需要使用单个变量来引用这10个以上类中的任何一个的实例,则可能值得定义一个联合类型:

type AnySubClass = SubClass1 | SubClass2 | SubClass3/*...*/;

...然后将其用于aClass