Typescript 类型的参数不可分配给类型为';字符串';

Typescript 类型的参数不可分配给类型为';字符串';,typescript,Typescript,我正在尝试用typescript编写EventEmitter。出现错误:类型为“Events.sessionCreationStart”的参数不能分配给类型为“string”的参数。 enum Events { SessionCreationStarting, SessionCreationSucceeded, SessionCreationFailed, } type EventMap = Record<string, any>; type EventKey<

我正在尝试用typescript编写EventEmitter。出现错误:
类型为“Events.sessionCreationStart”的参数不能分配给类型为“string”的参数。

enum Events {
  SessionCreationStarting,
  SessionCreationSucceeded,
  SessionCreationFailed,
}

type EventMap = Record<string, any>;

type EventKey<T extends EventMap> = string & keyof T;

type EventReceiver<T> = (params: T) => void;

type ListenerMap = Record<string, any>;

type ListenerKey<T extends ListenerMap> = string & keyof T;

class EventEmitter<T extends ListenerMap> {
  _listeners: {
    [K in keyof ListenerMap]?: Array<(p: ListenerMap[K]) => void>;
  } = {}

  on<K extends ListenerKey<T>>(eventName: K, listener: (data: T) => void) {
    this._listeners[eventName] = (this._listeners[eventName] || []).concat(listener);

    return () => {
      this._listeners[eventName] = (this._listeners[eventName] || []).filter(eventListener => listener !== eventListener);
    }
  }

  dispatch<K extends ListenerKey<T>>(eventName: K, data?: T[K]) {
    this._listeners[eventName]?.forEach((fn) => {
      fn.call(null, data);
    });
  }
}

const eventEmmiter = new EventEmitter()

eventEmmiter.dispatch(Events.SessionCreationStarting) <-------- Error
枚举事件{
会话创建开始,
会话创建成功,
会话创建失败,
}
类型EventMap=记录;
类型EventKey=string&keyof T;
类型EventReceiver=(参数:T)=>void;
类型ListenerMap=记录;
类型ListenerKey=string&keyof T;
类事件发射器{
_听众:{
[K in keyof ListenerMap]?:数组void>;
} = {}
打开(eventName:K,侦听器:(数据:T)=>void){
this._listeners[eventName]=(this._listeners[eventName]| |[])。concat(listener);
return()=>{
此._侦听器[eventName]=(此._侦听器[eventName]| |[]).filter(eventListener=>listener!==eventListener);
}
}
调度(事件名称:K,数据?:T[K]){
此._侦听器[eventName]?.forEach((fn)=>{
fn.调用(空,数据);
});
}
}
const eventEmmiter=new EventEmitter()

eventEmmiter.dispatch(Events.SessionCreationStarting)这是因为根据默认行为,
Events
enum成员的值都是数字

您可以做的是将枚举设置为字符串枚举-为每个枚举成员指定一个文本值:

enum Events {
  SessionCreationStarting = 'SessionCreationStarting',
  SessionCreationSucceeded = 'SessionCreationSucceeded',
  SessionCreationFailed = 'SessionCreationFailed',
}

谢谢,很好的解决方案!但我希望名为
Events
的枚举保持“干净”的状态,这是我找到的最佳解决方案