TypeScript如何使用计算类型正确构造Record类型返回值
问题原因
TypeScript 现有类型系统存在限制:当你使用绑定了泛型参数的动态值作为对象字面量的键时,TS 无法自动将键的类型收窄为你定义的 RefName<EventName> 精确字面量类型,会默认推导为更宽泛的索引类型,因此出现类型不匹配报错。
解决方案
方案1:对象类型断言(最简可行方案)
直接对整个返回的对象做类型断言即可,你的业务逻辑已经保证该结构符合类型要求,断言是安全的:
const useViewedEventTwo = <EventName extends keyof SegmentEventMap>(event: EventName): Record<RefName<EventName>, string> => { return { [refName(event)]: '' } as Record<RefName<EventName>, string>; }
方案2:键显式类型标注
你也可以提前把动态键的类型显式标注,再构造对象:
const useViewedEventTwo = <EventName extends keyof SegmentEventMap>(event: EventName): Record<RefName<EventName>, string> => { const key = refName(event) as RefName<EventName>; return { [key]: '' }; }
内容的提问来源于stack exchange,提问作者Gajus
相关产品推荐
相关产品推荐

