为何TypeScript中泛型索引访问类型会解析为交叉类型?
为什么TypeScript中
MyEventObjects[K]与MyEventObjects[keyof MyEventObjects]类型解析不同? 一、MyEventObjects[K]为何被解析为交叉类型(导致报错)
你写的handleEvent是泛型函数,K是约束在keyof MyEventObjects范围内的泛型参数——这意味着K可以是'click'、'keypress',甚至是两者的联合类型'click' | 'keypress'。
在函数体内部,TypeScript无法提前确定K的具体值,会按最严格的标准检查代码:要求调用callback时传入的参数,必须能适配所有可能的K对应的类型。
比如如果K是联合类型'click' | 'keypress',理论上MyEventObjects[K]是MyMouseEvent | MyKeyboardEvent,但TypeScript要求传入的参数必须同时满足这两个类型(要适配所有可能的K),也就是MyMouseEvent & MyKeyboardEvent交叉类型。你传入的{x:0,y:0}只有x和y属性,缺少key,自然不符合交叉类型的要求,所以报错。
二、MyEventObjects[keyof MyEventObjects]为何是联合类型
keyof MyEventObjects直接就是'click' | 'keypress'这个联合类型,当用联合类型作为索引访问对象类型时,TypeScript会返回对应索引值类型的联合——也就是MyEventObjects['click'] | MyEventObjects['keypress'],最终结果就是MyMouseEvent | MyKeyboardEvent。
这是TypeScript索引访问类型的基本规则:索引为联合类型时,结果就是各索引对应值类型的联合。
内容的提问来源于stack exchange,提问作者gmoniava
相关产品推荐
相关产品推荐

