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

在Typescript中的泛型类内初始化泛型类型,typescript,typescript-generics,typescript-types,typescript-class,Typescript,Typescript Generics,Typescript Types,Typescript 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

我想使用泛型类型在泛型类内初始化泛型类变量,但我不知道是否有方法可以做到这一点

使用类型初始化很好,但它似乎不适用于泛型

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 :(
}
我发现以下错误类型“{}”不可分配给类型“ListenerList”。有办法做到这一点吗?

K可以是字符串文字类型,因此EventProcesser是有效的,这意味着侦听器必须具有名为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
}

ListenerList假定对象至少有一个属性。在[T in K]后面添加问号是安全的,因为您告诉typescript,对象中至少有零个属性。谢谢,这也很有效!