Перенос общего значения в общий список в универсальном классе в Typescript - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь поместить универсальный объект в список универсальных объектов внутри универсального класса.

Возможно, это просто что-то с семантикой, но я не совсем уверен, что я делаю здесь неправильно.

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]'.

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Просто удалите дополнительные ключи из

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[] };
0 голосов
/ 21 мая 2019

Я понял, что мне нужно добавить ! в переменную listeners, так как не уверен, что у listeners вообще есть какие-либо ключи.Поэтому решение заключается в следующем:

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