鉴于以下类层次结构,我是否以及如何将具体处理程序实例类型映射到特定事件类实例?
class Event {}
class EventA extends Event {
constructor(public readonly value: number) {
super();
}
}
class EventB extends Event {
constructor(public readonly message: string) {
super();
}
}
abstract class EventHandler<T> {
public abstract run(): T;
}
class EventAHandler extends EventHandler<number> {
constructor(private readonly event: EventA) {
super();
}
public run() {
return this.event.value + 1;
}
}
class EventBHandler extends EventHandler<string> {
constructor(private readonly event: EventB) {
super();
}
public run() {
return this.event.message + ' world!';
}
}
class EventHandlerFactory {
static createHandler<T extends Event>(event: T) {
if (event instanceof EventA) {
return new EventAHandler(event);
}
if (event instanceof EventB) {
return new EventBHandler(event);
}
throw new Error('Not implemented!');
}
}
const event = new EventA(1);
// T in createHandler is inferred as EventA
const handler = EventHandlerFactory.createHandler(event); // EventAHandler | EventBHandler
const result = handler.run(); // string | number -> should be number
我想要的是让 handler
推断(或成为)EventAHandler
而不是联合类型(没有类型断言 as
),这样我就可以确定特定处理程序的结果。
答案 0 :(得分:0)
您可以使用条件类型来完成这项工作,但您必须进行一些转换:
type EventHandlerFromEvent<T extends Event> =
T extends EventA ? EventAHandler : EventBHandler;
class EventHandlerFactory {
static createHandler<T extends Event>(event: T): EventHandlerFromEvent<T> {
if (event instanceof EventA) {
return new EventAHandler(event) as EventHandlerFromEvent<T>;
}
if (event instanceof EventB) {
return new EventBHandler(event) as EventHandlerFromEvent<T>;
}
throw new Error("Not implemented!");
}
}