在 Typescript 中的泛型 class 中初始化泛型类型

Initializing generic type inside generic class in Typescript

我想使用泛型类型在泛型 class 中初始化一个泛型 class 变量,但我不知道是否有办法做到这一点。

使用类型进行初始化工作正常,但它似乎不适用于泛型。

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>'。有办法吗?

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
}