Инициализация универсального типа внутри универсального класса в Typescript - PullRequest
0 голосов
/ 20 мая 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> = {}; // 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> = {}; // Error :(
}

Я получаю следующую ошибку Type '{}' is not assignable to type 'ListenerList<K, I, O, V>'. Есть ли способ сделать это?

1 Ответ

1 голос
/ 20 мая 2019

K может быть строковым литералом, поэтому EventProcesser<'prop', ..> является допустимым, что означает, что listeners должно иметь свойство с именем prop. Это означает, что ваше значение по умолчанию не будет действительным для любых переданных K, как и должно быть.

Вы можете использовать Partial, чтобы сообщить компилятору, что свойства не требуются:

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> = {}; // Works fine

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