我已经按照以下方式创建了一个接口和抽象类:
interface ITest<A, B> {
testFunc: (input: A) => B;
}
abstract class AClass<A, B> {
abstract testFunc: (input: A) => B;
}
我有多个扩展AClass
的子类和多个使用ITest
和A
的各种类型实现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>[]
)声明这些变量吗?
答案 0 :(得分:1)
您将使用aClass
和iTests
所指的任何具体类型。如果他们要在不同的时间引用不同的类型,那么您将使用一个联合列出它们可能引用的类型。例如,如果aClass
可能需要引用SubClass1
的实例或SubClass2
的实例,则:
let aClass: SubClass1 | SubClass2;
any, any
是最坏的情况,您根本不知道具体的类型是什么。
您说过您有10多个。如果您确实需要使用单个变量来引用这10个以上类中的任何一个的实例,则可能值得定义一个联合类型:
type AnySubClass = SubClass1 | SubClass2 | SubClass3/*...*/;
...然后将其用于aClass
。