基于字符串字面量类型创建键值对象类型的TypeScript报错问题
解决TypeScript字符串字面量类型转对象键的类型错误
咱们先拆解下你遇到的问题:你的ExtractRouteParams类型逻辑上完全能实现预期效果,但TypeScript抛出了类型不兼容的错误——这是因为泛型T没有明确的类型约束,TS无法确保T的所有成员都是合法的对象键类型(也就是string | number | symbol),即便你实际传入的是字符串字面量联合类型。
修复方案1:给泛型添加通用键约束
我们可以给T加上extends keyof any的约束,keyof any正是TypeScript定义的合法对象键类型集合,这样TS就能确定T的成员都是可作为对象键的类型:
export type ExtractRouteParams<T extends keyof any> = string extends T ? Record<string, string> : { [k in T] : string | number } type P = ExtractRouteParams<'Id1' | 'Id2'> // 得到预期类型:{ Id1: string | number; Id2: string | number; }
修复方案2:针对字符串场景的精准约束
如果你确定T只会是字符串相关类型(比如字符串字面量或string本身),可以把约束更精准地设为extends string,更贴合你的使用场景:
export type ExtractRouteParams<T extends string> = string extends T ? Record<string, string> : { [k in T] : string | number } type P = ExtractRouteParams<'Id1' | 'Id2'> // 同样能得到正确的目标类型
为什么原代码会报错?
在你最初的代码中,泛型T没有任何约束,TS会默认假设T可以是任意类型(比如boolean、object这类不能作为对象键的类型)。当你尝试用k in T生成对象键时,TS就会抛出错误,提示T无法保证是合法的键类型。加上约束后,TS就能确认T的成员符合要求,错误自然就消失了。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

