打字稿:泛型类,其中未绑定类型取决于另一个泛型

时间:2020-10-30 20:01:22

标签: typescript

我有一些课程

class EventBase<T> {
  constructor(readonly target: T) {}
}

class A {}
class B extends A {}

我希望每种事件类型都有特定于事件的处理程序。 当前有效的是:

class EventHandler<T extends A, E extends Event<T>> {
   public doSomething(): T {...}
   public doSomethingElse(): {...}
}

有了这个,我现在可以进行特定的鼠标事件:

class MouseClickEvent extends Event<B> {
   constructor(target: B) {
      super(target);
   }
}

并初始化鼠标事件处理程序:

const mouseClickHandler = new EventHandler<B, MouseClickEvent>();

现在让我感到烦恼的事情

为什么应该从B得知EventHandler时在T=B的构造函数中指定E=MouseClickEvent extends Event<B>。 我能以某种方式从T推断E并仍然在T中使用EventHandler吗?

T(即EventHandler)中删除class EventHandler<E extends Event<T>>的显式减速度将得到Cannot find name 'T'.

是否有一个泛型类型可以扩展另一个泛型类型的类型,而不必在类型减速或调用构造函数时明确提及?

编辑:我最初忽略了T也有约束的事实。 T extends A用于某些A类。这使其变得更加棘手。

1 个答案:

答案 0 :(得分:0)

我发现一个可能的解决方法是使用infer

我定义类型

type TargetType<E extends EventBase<unknown>> = E extends EventBase<infer T> ? T : never;

然后将EventHandler更改为

class EventHandler<E extends Event<T>, T=TargetType<E>> {
   public doSomething(): T {...}
   public doSomethingElse(): E {...}
}

编辑:如果T还有一个约束T extends A,这似乎不起作用。