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

为何TypeScript无法为我的泛型函数推断类型?

问题分析与修复

你的核心问题出在**GroupedObject类型定义的逻辑错误**,以及函数内部的类型断言不准确,导致TypeScript无法正确推断分组后的结构和提供智能提示。

错误点拆解

  • 类型定义逻辑颠倒:你原本想根据对象的键(比如color-background-primary)拆分出分组前缀,但代码里却用了T[K](对象的值)来做字符串拆分,这完全不符合你的业务逻辑。
  • 类型断言不精准:函数内部对groupedObject[group]的断言范围过大,没有锁定到对应分组的键集合,导致TypeScript无法识别具体的键结构。

修正后的代码

1. 修正GroupedObject类型

type GroupedObject<T extends Record<string, string>> = {
  // 遍历对象的键,拆分出分组前缀作为新对象的键
  [K in keyof T & string as K extends `${infer Group}-${infer Rest}` ? Group : never]: {
    // 筛选出当前分组下的所有原始键
    [Key in keyof T as Key extends `${K}-${infer Rest}` ? Key : never]: T[Key]
  }
}

2. 修正函数内部的类型断言

export function groupObjectByPattern<T extends Record<string, string>>(obj: T): GroupedObject<T> {
  const groupedObject = {} as GroupedObject<T>;

  for (const key in obj) {
    const [group] = key.split('-');
    // 只针对当前分组的键进行断言,而非宽泛的Pick
    if (!groupedObject[group]) {
      groupedObject[group] = {} as { [Key in keyof T as Key extends `${typeof group}-${infer Rest}` ? Key : never]: T[Key] };
    }
    groupedObject[group][key] = obj[key];
  }

  return groupedObject;
}

验证效果

用你的测试代码验证,现在groupedObject.color会正确推断出所有以color-开头的键值对,编辑器也会提供完整的智能提示:

const inputObject = {
  "color-background-primary": "#ffffff",
  "color-background-secondary": "#f3f4f4",
  "color-background-tertiary": "#e4e7e7",
  "color-background-interactive": "#0b968f",
  "color-background-hover": "#026661",
  "color-background-active": "#2079c3",
  "font-primary": "foo",
  "space-xs": "xs",
};

const groupedObject = groupObjectByPattern(inputObject);
// 现在能正确获取智能提示,类型推断完全符合预期
groupedObject.color; // { "color-background-primary": string; ... }
groupedObject.font; // { "font-primary": string }
groupedObject.space; // { "space-xs": string }

内容的提问来源于stack exchange,提问作者nas.engineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:17:07