从字符串字面量类型生成键值对象类型的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
相关产品推荐
相关产品推荐

