TypeScript点符号访问对象属性的工具类型TS错误解决咨询
解决TypeScript错误:
Type 'K' cannot be used to index type 'T' 我有一个可运行的TypeScript示例,能正确推断变量类型,但始终存在类型错误Type 'K' cannot be used to index type 'T',代码如下:
type PropertyAccessor<ObjectType, Key extends keyof ObjectType> = Key extends string ? ObjectType[Key] extends Record<string, unknown> ? `${Key}.${PropertyAccessor<ObjectType[Key], keyof ObjectType[Key]>}` : Key : never; type NestedObjectType<T> = { [K in PropertyAccessor<T, keyof T>]: K extends `${infer Head}.${infer Rest}` ? Head extends keyof T ? Rest extends PropertyAccessor<T[Head], keyof T[Head]> ? NestedObjectType<T[Head]>[Rest] : never : never : K extends keyof T ? T[K] : never; }; function accessProperty<T, K extends keyof NestedObjectType<T>>(obj: T, accessor: K): NestedObjectType<T>[K] { return obj[accessor]; // 此处触发类型错误 } const obj = { name: 'cory', profile: { emails: ['cory@gmail.com', 'cory@yahoo.com'], age: 37 } }; // TypeScript能正确推断age为number类型 const age = accessProperty(obj, 'profile.age');
错误原因
accessor的类型K是NestedObjectType<T>的键,包含'profile.age'这类嵌套路径字符串,但obj是原始的T类型——TypeScript只允许用T自身的直接键(比如'name'、'profile')去索引对象,无法识别拼接后的嵌套路径字符串,因此抛出类型错误。
修复方案
需要在运行时实现嵌套路径的解析逻辑,拆分路径后逐层访问对象属性:
function accessProperty<T, K extends keyof NestedObjectType<T>>(obj: T, accessor: K): NestedObjectType<T>[K] { // 将路径拆分为单个键,逐层遍历访问 const keys = accessor.split('.') as Array<string>; let current: any = obj; for (const key of keys) { current = current[key]; } return current; }
修改后,类型错误会消失,同时TypeScript仍能正确推断返回值的类型。
内容的提问来源于stack exchange,提问作者Cory Robinson
相关产品推荐
相关产品推荐

