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

Posted

技术标签:

【中文标题】在 Typescript 的泛型类中初始化泛型类型【英文标题】:Initializing generic type inside generic class in 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,对象中至少有零个属性。 谢谢,这也有效! 【参考方案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

【讨论】:

以上是关于在 Typescript 的泛型类中初始化泛型类型的主要内容,如果未能解决你的问题,请参考以下文章

无法将X类型转换为T.泛型类中的泛型委托

17.scala的泛型类

受保护的泛型类 - 是不是支持?

怎么取出类的泛型类型

Java中的泛型的问题?

泛型和枚举