为何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
相关产品推荐
相关产品推荐

