【问题标题】:Use typescript interface & abstract class without specifying generic types使用 typescript 接口和抽象类而不指定泛型类型
【发布时间】:2020-01-10 13:36:47
【问题描述】:

我按照这些思路创建了一个接口和抽象类:

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

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

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

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&lt;any, any&gt;[])?

【问题讨论】:

  • 您为aClassiTests 分配了哪些您不知道要使用的具体类型的值?只是为了确保我们能给出最好的答案。
  • @T.J.Crowder 我编辑了我的答案以提供更多上下文

标签: typescript typescript-generics


【解决方案1】:

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

let aClass: SubClass1 | SubClass2;

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

你说过你有 10 多个。如果你真的需要使用一个变量来引用这 10 多个类中的任何一个的实例,那么定义一个联合类型可能是值得的:

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

...然后将其用于aClass

【讨论】:

  • 我可能有 10 多个扩展 AClass 的子类,每个子类都有自己独特的类型。因此,具有这么多类型选项的联合类型感觉有点脏,但any, any 也是如此。也许这表明可能有更好的方法来设计我想要实现的东西。
  • @Wrokar - 也许吧。 (我已经更新了答案。)至少有一个工会,你知道你不会不小心引用不是这 10 多个之一的东西......
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 2020-05-14
  • 2015-02-20
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
相关资源
最近更新 更多