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[]数组类型。
使用示例
我们来看几种不同场景下的类型推导结果:
- 默认场景(返回数组)
// 不指定InnerField,默认返回数组 type ArrayConverter = MultipleObjFunction<{ id: number }, { uid: string }>; // 等价于:(objs: { id: number }[]) => { uid: string }[]
- 指定单个键(返回带该键的对象)
// 指定InnerField为"results",返回包含该键的对象 type ObjectConverter = MultipleObjFunction<{ id: number }, { uid: string }, "results">; // 等价于:(objs: { id: number }[]) => { results: { uid: string }[] }
- 指定联合类型键(返回多键对象)
如果需要多个键,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
相关产品推荐
相关产品推荐

