如何解决类型的参数不能分配给类型为'string'的参数
我试图用打字稿写一个EventEmitter。发生错误:Argument of type 'Events.SessionCreationStarting' is not assignable to parameter of type '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
Code in sandbox
解决方法
这是因为根据默认行为,Events
枚举成员的值都是数字。
您可以做的是使您的枚举成为字符串枚举-为每个枚举成员提供一个文字值:
enum Events {
SessionCreationStarting = 'SessionCreationStarting',SessionCreationSucceeded = 'SessionCreationSucceeded',SessionCreationFailed = 'SessionCreationFailed',}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。