0

我正在尝试将通用对象推送到通用类中的通用对象列表中。

这可能只是语义上的问题,但我不确定我在这里做错了什么。

type EventCallback<I, O> = (event: I) => O;

type ListenerList<K extends string | symbol | number, I, O, V extends EventCallback<I, O>> = {
    [T in K]?: V[];
};

const test: ListenerList<string, string, string, (event: any) => any> = {
   test : [],
};

const key = 'test';
test[key]!.push((event: string) => 'Hello ' + event); // Works fine

export default class EventProcesser<
  K extends string | symbol | number,
  I,
  O,
  V extends EventCallback<I, O>
> {
  private listeners: ListenerList<K, I, O, V> = {};

  public on(target: K, callback: V): void {
    this.listeners[target].push(callback); // Error
  }
}

如果我定义类型,它可以工作,但感觉不是解决问题的好方法:

...
   (this.listeners[target] as V[]).push(callback) // Works
...

我得到的错误如下Property 'push' does not exist on type 'ListenerList<K, I, O, V>[K]'

4

2 回答 2

0

我意识到我需要添加!listeners变量中,因为根本不确定是否listeners有任何键。因此,解决方案是改为执行以下操作:

   this.listeners[target]!.push(callback) // Works
于 2019-05-21T07:51:10.423 回答
0

只需从中删除可选键

type ListenerList<K extends string | symbol | number, I, O, V extends EventCallback<I, O>> = { [T in K]?: V[] };

=>

type ListenerList<K extends string | symbol | number, I, O, V extends EventCallback<I, O>> = { [T in K]: V[] };
于 2019-05-21T07:55:42.107 回答