限制从 EventEmitter3 发出

问题描述 投票:0回答:1

与接受的答案相关:https://stackoverflow.com/a/63639280/17928771

EventEmitter3 是一个通用类,它采用(作为一个示例)事件/处理程序的接口。我正在尝试将

IRaceManager
emit
s 限制为
IRaceEvents
。我试过:

尝试 1.

class POSRaceManager implements IRaceManager extends EventEmitter<IRaceEvents> {}

let raceManager: IRaceManager = new POSRaceManager();
raceManager.emit('moo'); // error, no `emit` on IRaceManager

尝试 2.

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 的扩展)

尝试 3.

这失败了:

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>;
typescript-generics eventemitter
1个回答
0
投票

“哪一部分你不明白?”

答案:核心概念? (弓箭手语录)

这是一个粗略的学习曲线,但最终有了一个向前推进的解决方案:

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);
  }
    
© www.soinside.com 2019 - 2024. All rights reserved.