【发布时间】:2020-06-18 21:22:34
【问题描述】:
我试图在通用参数中使用extends 来索引对象,但出现以下错误:
“IHandlerMap[K]”类型的参数不可分配给“BasicHandler”类型的参数。 键入'基本处理程序 | KeyPressHandler' 不可分配给类型 'BasicHandler'。 类型 'KeyPressHandler' 不可分配给类型 'BasicHandler'.ts(2345)
代码:
export type BasicHandler = () => void;
export type KeyPressHandler = (keyCode: number) => void;
interface IHandlerMap {
OnTick: BasicHandler;
OnKeyDown: KeyPressHandler;
}
type HandlersType = {[key in keyof IHandlerMap]: IHandlerMap[key][]};
export class EventManager {
private readonly handlers: HandlersType = {
OnTick: [],
OnKeyDown: [],
};
public addHandler<K extends keyof IHandlerMap>(
type: K,
handler: IHandlerMap[K]
): {
this.handlers[type].push(handler); // Error is occuring here.
}
}
似乎只有当对象属性可以是BasicHandler或KeyPressHandler时,TS才能推断出对象属性是BasicHandler类型的数组?
如何使用keyof 来索引接口 (handler: IHandlerMap[K]),然后使用该参数推送到同样为 type'd (this.handlers[type].push(handler)) 的对象键?
我在解释我想要做什么时遇到了很多麻烦,这是错误的做法吗?如果是这样,有什么替代方法?
【问题讨论】:
-
有趣的是,我现在没有看到任何其他方法,除了断言像
any这样的不健全类型。我希望@jcalz 会检查一下。
标签: typescript generics types typescript-typings typescript-generics