Typescript 类型的参数不可分配给类型为';字符串';
我正在尝试用typescript编写EventEmitter。出现错误:Typescript 类型的参数不可分配给类型为';字符串';,typescript,Typescript,我正在尝试用typescript编写EventEmitter。出现错误:类型为“Events.sessionCreationStart”的参数不能分配给类型为“string”的参数。 enum Events { SessionCreationStarting, SessionCreationSucceeded, SessionCreationFailed, } type EventMap = Record<string, any>; type EventKey<
类型为“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
的枚举保持“干净”的状态,这是我找到的最佳解决方案