我有一些课程
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类。这使其变得更加棘手。
答案 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
,这似乎不起作用。