与接受的答案相关:https://stackoverflow.com/a/63639280/17928771
EventEmitter3 是一个通用类,它采用(作为一个示例)事件/处理程序的接口。我正在尝试将
IRaceManager
emit
s 限制为 IRaceEvents
。我试过:
class POSRaceManager implements IRaceManager extends EventEmitter<IRaceEvents> {}
let raceManager: IRaceManager = new POSRaceManager();
raceManager.emit('moo'); // error, no `emit` on IRaceManager
interface IRaceManager extends EventEmitter<IRaceEvents> {} // TS2749: 'EventEmitter' refers to a value, but is being used as a type here. Did you mean 'typeof EventEmitter'?
以下尝试有效,但不会将
emit
或 on
限制为 IRaceEvents(或 IRaceEvents 的扩展)
这失败了:
type RaceEventEmitterType<T extends IRaceEvents> = InstanceType<typeof EventEmitter>;
type IRaceManager<T extends IRaceEvents> = RaceEventEmitterType<T>;
let raceManager: IRaceManager = new POSRaceManager<IRaceEvents>;
raceManager.emit("moo"); // no error because of `InstanceType<typeof EventEmitter>`
type RaceEventEmitterType<T extends IRaceEvents> = InstanceType<typeof EventEmitter<IRaceEvents>>; // Need to investigate what this does, actually. I overlooked a syntax error before.
有什么想法可以限制从
raceManager<?>
到T extends IRaceEvents
的排放量吗?
我目前解决了以下问题(有效,我只是想知道是否有办法解决上述问题):
type RaceEventEmitter<T extends IRaceEvents> = InstanceType<typeof EventEmitter>;
type IRaceManager<T extends IRaceEvents> = RaceEventEmitter<T>;
class POSRaceManager extends EventEmitter<IRaceEvents> implements IRaceManager<IRaceEvents>;
“哪一部分你不明白?”
答案:核心概念? (弓箭手语录)
这是一个粗略的学习曲线,但最终有了一个向前推进的解决方案:
type TRaceEvents = {
raceUpdate: (race: IRace | null) => void;
}
// Extending EventEmitter is essential to ensure the implementation properly
// extends `EventEmitter`; however, `extends EventEmitter<TRaceEvents>` has
// no additional affect (though is preferred as the Runner could fail to
// function properly if the impl isn't Typed with `TRaceEvents`)
interface IRaceManager extends EventEmitter {
race: IRace;
start() => void;
}
class StandardRaceManager extends EventEmitter<TRaceEvents> implements IRaceManager {
constructor(public race: IRace) { super(); }
}
const standardRace: TRaceManager = new StandardRaceManager();
standardRace.on("raceUpdate", race => console.log(race));
standardRace.start();
standardRace.emit("raceUpdate", race);
以下没有编译错误或运行时错误(并且按预期工作),但 WebStorm 抱怨如下:
class StandardRaceManager extends EventEmitter<TRaceEvents> implements IRaceManager {
constructor(public race: IRace) {
super();
// `this.race`: Argument type IRace is not assignable to parameter type any
this.emit("raceUpdate", this.race);
}