我有一个包含类似于以下内容的事件类型的界面
interface Events {
foo: (a: string,b: number) => void;
bar: (a: boolean) => void;
}
现在,我想创建一个
Map
实例,其键受到 Events
接口的约束,因此如果使用 foo
的键值,则它必须遵守 Events.foo
的键入。
我在哪里
const listeners = new Map<keyof Events, { handler: ??, once: boolean}[]>();
您可以尝试使用通用方法制作自己的地图:
interface Events {
foo: (a: string,b: number) => void;
bar: (a: boolean) => void;
}
type Listener<F extends (...args: any) => any> = {handler: F, once: boolean};
class EventMap extends Map{
set<K extends keyof Events>(key: K, listener: Listener<Events[K]>){
this.set(key, listener);
return this;
}
get<K extends keyof Events>(key: K): Listener<Events[K]> | undefined {
return this.get(key);
}
}
const listeners = new EventMap;
listeners.set('foo', {handler: (a, b) => {
a; // string
b; // number;
}, once: false});
const {handler} = listeners.get('foo')!; // const handler: (a: string, b: number) => void