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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:17:43