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

TypeScript中能否在条件类型结果字段中使用泛型参数值?自定义多对象转换泛型函数类型的实现咨询

解答:在TypeScript条件类型中使用泛型参数作为对象键

当然可以在条件类型的结果字段中使用泛型参数的值!你遇到的核心问题是误用了TypeScript里不存在的valueof语法,其实我们可以用TypeScript内置的工具类型或映射类型来轻松实现需求。

修正后的类型定义

我们可以利用Record工具类型(它是映射类型的简写形式)来动态生成带有指定键的对象类型。这里是重构后的MultipleObjFunction:

export type MultipleObjFunction<
  InputDataType,
  OutputDataType,
  InnerField extends string | undefined = undefined
> = (objs: InputDataType[]) => 
  InnerField extends string 
    ? Record<InnerField, OutputDataType[]> 
    : OutputDataType[];

关键细节解释

  • 当InnerField是string类型时,Record<InnerField, OutputDataType[]>会生成一个对象类型:唯一的键就是InnerField的泛型值,对应的值类型是OutputDataType[]。
  • 如果InnerField是undefined(我们给它设置了默认值),则直接返回普通的OutputDataType[]数组类型。

使用示例

我们来看几种不同场景下的类型推导结果:

  1. 默认场景(返回数组)
// 不指定InnerField,默认返回数组
type ArrayConverter = MultipleObjFunction<{ id: number }, { uid: string }>;
// 等价于:(objs: { id: number }[]) => { uid: string }[]
  1. 指定单个键(返回带该键的对象)
// 指定InnerField为"results",返回包含该键的对象
type ObjectConverter = MultipleObjFunction<{ id: number }, { uid: string }, "results">;
// 等价于:(objs: { id: number }[]) => { results: { uid: string }[] }
  1. 指定联合类型键(返回多键对象)
    如果需要多个键,Record也能轻松处理联合类型的字符串:
type MultiKeyConverter = MultipleObjFunction<{ id: number }, { uid: string }, "data" | "metadata">;
// 等价于:(objs: { id: number }[]) => { data: { uid: string }[]; metadata: { uid: string }[] }

为什么原来的写法不对?

TypeScript中确实没有valueof语法,而当你的泛型参数InnerField已经约束为string | undefined时,直接把它作为键类型即可——Record或映射类型(比如{ [K in InnerField]: OutputDataType[] })会自动帮你把泛型参数的值转化为对象的键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:07:43