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

从字符串字面量类型生成键值对象类型的TypeScript实现问题

解决TypeScript泛型映射类型的键类型报错问题

你遇到的这个错误是因为TypeScript无法确定泛型T一定是合法的对象键类型(也就是string | number | symbol),所以在映射类型{ [k in T] : ... }里会抛出类型不兼容的提示。

解决方案:给泛型T添加类型约束

只需要在泛型定义时明确T必须是string | number | symbol的子类型,这样TypeScript就会确认T可以安全地作为对象键使用:

export type ExtractRouteParams<T extends string | number | symbol> = 
  string extends T ? Record<string, string> : { [k in T] : string | number }

type P = ExtractRouteParams<'Id1' | 'Id2'>
// 预期结果:type P = { Id1: string | number; Id2: string | number; }

为什么这样能解决问题?

原来的代码里没有对T做任何约束,TypeScript会假设T可能包含非合法键类型(比如boolean、object这类不能作为对象键的类型),因此会报错提醒。加上T extends string | number | symbol的约束后,TypeScript就知道传入的T一定是符合对象键要求的类型,映射类型的语法也就合法了。

如果你的场景只需要处理字符串字面量,也可以把约束缩小为T extends string,这样更贴合你的使用场景:

export type ExtractRouteParams<T extends string> = 
  string extends T ? Record<string, string> : { [k in T] : string | number }

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:51:42