如何输入 Map 以便键和值在给定界面中具有各自的类型

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

我有一个包含类似于以下内容的事件类型的界面

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}[]>();
typescript
1个回答
0
投票

您可以尝试使用通用方法制作自己的地图:

游乐场

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