You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:05:24