Я пытаюсь поместить универсальный объект в список универсальных объектов внутри универсального класса.
Возможно, это просто что-то с семантикой, но я не совсем уверен, что я делаю здесь неправильно.
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]'
.