TypeScript:如何根据对象字符串键自动推断回调中属性值类型?
解决TypeScript嵌套键回调值类型推断问题
问题出在当前函数的泛型设计上:回调函数的泛型K独立于外部函数,TypeScript无法将传入的key参数和回调内部的K关联,导致无法正确推断value的具体类型。
要解决这个问题,需要把K从回调的泛型提升到函数级别的泛型参数,让TypeScript能根据传入的key直接锁定K的具体类型,进而推导GetValueByKey<T, K>的结果。
修改后的完整代码如下:
type NestedKeyOf<T extends object> = { [K in keyof T & (string | number)]: T[K] extends object ? `${K}` | `${K}.${NestedKeyOf<T[K]>}` : `${K}`; }[keyof T & (string | number)]; type GetValueByKey< T, K extends string, > = K extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? GetValueByKey<T[Key], Rest> : never : K extends keyof T ? T[K] : never; const Myobj = { a: { b: { c: 100, }, }, }; // 改动点:将K提升为函数级泛型参数,约束为NestedKeyOf<T> function ololo<T extends object, K extends NestedKeyOf<T>>( key: K, callback: (args: { value: GetValueByKey<T, K> }) => boolean ): void { return; } ololo<typeof Myobj>("a.b.c", ({ value }) => { console.log(value); // 此时value类型自动推断为number return true; });
关键改动说明
- 函数泛型新增
K extends NestedKeyOf<T>,让key的类型直接绑定到K,TypeScript会根据传入的具体键(比如"a.b.c")推断出K的字面量类型。 - 回调函数不再需要自己的泛型,直接复用函数级的
K,此时GetValueByKey<T, K>就能精准解析出对应属性的类型,无需手动指定。
内容的提问来源于stack exchange,提问作者user9582211
相关产品推荐
相关产品推荐

