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

求助:如何基于TypeScript函数输入类型定义输出类型

解决TypeScript函数输入驱动的嵌套输出类型推断问题

你的问题核心是让TypeScript根据输入对象的字符串数组元素,精准推断输出对象的嵌套键类型,实现完整的编译时自动补全。当前实现的问题在于泛型类型合并了所有子数组的元素,导致无法为每个根键单独匹配对应的子键,且未保留数组元素的字面量类型。

问题根源分析

你原有的返回类型Record<keyof T, Record<T[keyof T][number], Array<string>>>存在两个缺陷:

  1. T[keyof T][number]会提取所有根键下数组元素的联合类型,如果有多个根键,每个子对象会包含所有根键的子键,不符合需求。
  2. 未约束输入数组为字面量类型,TypeScript默认会把["B","C","D"]推断为string[],丢失具体的键名信息。

正确实现方案

通过映射类型逐个处理每个根键,结合字面量数组约束,让TypeScript精准推断嵌套结构:

const foo = <T extends Record<string, readonly string[]>>(x: T): {
  [K in keyof T]: Record<T[K][number], string[]>
} => {
  // 函数实现逻辑:初始化嵌套对象,每个子键对应空数组
  const result = {} as { [K in keyof T]: Record<T[K][number], string[]> };
  for (const rootKey in x) {
    result[rootKey] = {} as Record<T[typeof rootKey][number], string[]>;
    x[rootKey].forEach(subKey => {
      result[rootKey][subKey] = [];
    });
  }
  return result;
};

// 调用时用as const保留数组字面量类型,触发精准推断
const { A: { B, C, D } } = foo({ A: ["B", "C", "D"] as const });

关键细节说明

  1. 映射类型精准匹配:{ [K in keyof T]: Record<T[K][number], string[]> }遍历每个根键K,单独提取该键对应的数组元素T[K][number]作为子对象的键,实现根键与子键的一一对应。
  2. 字面量数组约束:readonly string[]配合调用时的as const,让TypeScript将数组元素识别为具体的字符串字面量(而非宽泛的string类型),从而实现子键的自动补全。
  3. 类型断言辅助实现:函数内部使用类型断言确保TypeScript认可初始化的对象结构与返回类型一致。

效果验证

调用上述代码后,TypeScript会自动识别:

  • 根键A存在
  • A的子对象包含B、C、D三个键,每个键的类型为string[]
  • 编写代码时会触发完整的自动补全,且错误的键名(如E)会被编译时报错提示

内容的提问来源于stack exchange,提问作者Milos Pavlovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:31:37