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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:33:23