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

如何让TypeScript正确推断输入输出键动态的函数返回类型?

解决TypeScript动态键函数的返回类型推断问题

要让TypeScript正确推断动态输入/输出键的函数返回类型,需要通过泛型捕获具体的键名,而非用宽泛的Record<string, I>作为返回类型。原代码的问题在于无法将inputKey/outputKey的具体值与输入对象的键关联,导致返回类型丢失了精确的键信息。

修改后的实现

function doSomething<
  KInput extends string = "input",
  KOutput extends string = "output",
  T extends Record<KInput, unknown>
>({
  inputKey = "input" as KInput,
  outputKey = "output" as KOutput,
  ...rest
}: { inputKey?: KInput; outputKey?: KOutput } & T): { [key in KOutput]: T[KInput] } {
  // 运行时校验输入键是否存在
  if (!(inputKey in rest)) {
    throw new Error(`Input key "${inputKey}" not found in input object.`);
  }

  return {
    [outputKey]: rest[inputKey],
  } as { [key in KOutput]: T[KInput] };
}

关键改动说明

  1. 泛型参数细化:新增KInput和KOutput两个泛型,分别捕获inputKey和outputKey的具体字符串类型,并设置默认值为"input"和"output",兼容默认调用场景。
  2. 输入类型约束:用T extends Record<KInput, unknown>确保输入对象必须包含KInput对应的键,同时结合{ inputKey?: KInput; outputKey?: KOutput }组成完整的入参类型。
  3. 精确返回类型:返回类型定义为{ [key in KOutput]: T[KInput] },直接映射输出键到输入键对应的类型,让TypeScript能精确推断返回对象的结构。

使用示例及类型推断结果

// 示例1:自定义outputKey
const result = doSomething({
  input: "value",
  outputKey: "out",
});
// result的类型被推断为:{ out: string }

// 示例2:自定义inputKey和outputKey
const result2 = doSomething({
  customInput: 123,
  inputKey: "customInput",
  outputKey: "customOutput",
});
// result2的类型被推断为:{ customOutput: number }

// 示例3:使用默认键
const result3 = doSomething({
  input: true,
});
// result3的类型被推断为:{ output: boolean }

这样修改后,函数的返回类型会根据传入的inputKey和outputKey动态推断,完全保留类型信息,避免了原代码中返回类型过于宽泛的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:32:15