【问题标题】:Initializing generic type inside generic class in Typescript在 Typescript 的泛型类中初始化泛型类型
【发布时间】:2019-10-06 22:00:04
【问题描述】:

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

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

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&lt;K, I, O, V&gt;'。有没有办法做到这一点?

【问题讨论】:

  • ListenerList 假设该对象至少具有一个属性。在[T in K] 后面添加一个问号就可以放心了,因为您是在告诉 typescript,对象中至少有零个属性。
  • 谢谢,这也有效!

标签: typescript typescript-generics typescript-types typescript-class


【解决方案1】:

K 可以是字符串文字类型,因此EventProcesser&lt;'prop', ..&gt; 是有效的,这意味着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
}

【讨论】:

    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多