typescript - 将泛型值推送到 Typescript 中泛型类中的泛型列表
问题描述
我正在尝试将通用对象推送到通用类中的通用对象列表中。
这可能只是语义上的问题,但我不确定我在这里做错了什么。
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<K, I, O, V>[K]'
:
解决方案
我意识到我需要添加!
到listeners
变量中,因为根本不确定是否listeners
有任何键。因此,解决方案是改为执行以下操作:
this.listeners[target]!.push(callback) // Works
推荐阅读
- python - 这些符号在功能建议中是什么意思?
- php - 从 MySQL 中选择不同的选项
- flutter - Flutter - 如何捕获仅在实时构建中而不是在调试中发生的崩溃?
- c# - C# WPF OnMouseEnter 和 OnMouseLeave 循环
- python - 哪个类在 Django REST 中调用序列化程序类
- python - 我可以在 python 脚本中使用 FFMPEG 将列表中的 mp4 文件合并到一个文件中吗
- java - 从 Kotlin 中的 deeplink Url 中提取 QueryParameters
- c++ - 当我为 long long 变量分配更大的数字时,为什么变量为 0?
- c++ - 如何配置 CodeLite IDE 以使用 C++ 和 SFML 库?(Windows/Linux) 配置完整解决方案
- javascript - 是否有任何处理程序来旋转对象?