如何让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] }; }
关键改动说明
- 泛型参数细化:新增
KInput和KOutput两个泛型,分别捕获inputKey和outputKey的具体字符串类型,并设置默认值为"input"和"output",兼容默认调用场景。 - 输入类型约束:用
T extends Record<KInput, unknown>确保输入对象必须包含KInput对应的键,同时结合{ inputKey?: KInput; outputKey?: KOutput }组成完整的入参类型。 - 精确返回类型:返回类型定义为
{ [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
相关产品推荐
相关产品推荐

