将泛型值推送到 Typescript 中泛型类中的泛型列表

Posted

技术标签:

【中文标题】将泛型值推送到 Typescript 中泛型类中的泛型列表【英文标题】:Pushing generic value on to generic list in a generic class in Typescript 【发布时间】:2019-10-07 13:38:28 【问题描述】:

我正在尝试将泛型对象推送到泛型类中的泛型对象列表中。

这可能只是语义上的问题,但我不确定我在这里做错了什么。

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> = 
   test : [],
;

const key = 'test';
test[key]!.push((event: string) => 'Hello ' + event); // 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> = ;

  public on(target: K, callback: V): void 
    this.listeners[target].push(callback); // Error
  

如果我定义类型,它可以工作,但感觉不是解决问题的好方法:

...
   (this.listeners[target] as V[]).push(callback) // Works
...

我得到的错误如下:Property 'push' does not exist on type 'ListenerList&lt;K, I, O, V&gt;[K]'

【问题讨论】:

【参考方案1】:

我意识到我需要将! 添加到listeners 变量中,因为不确定listeners 是否有任何键。因此,解决方案是改为执行以下操作:

   this.listeners[target]!.push(callback) // Works

【讨论】:

【参考方案2】:

只需从

中删除可选键
type ListenerList<K extends string | symbol | number, I, O, V extends EventCallback<I, O>> =  [T in K]?: V[] ;

=>

type ListenerList<K extends string | symbol | number, I, O, V extends EventCallback<I, O>> =  [T in K]: V[] ;

【讨论】:

那也是一种解决办法,但是会导致这个问题***.com/questions/56222509/…

以上是关于将泛型值推送到 Typescript 中泛型类中的泛型列表的主要内容,如果未能解决你的问题,请参考以下文章

Java中的泛型的问题?

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

java中泛型List问题

泛型和枚举

将泛型类扩展为静态内部类

对泛型编程中泛型类型的一些理解