TypeScript能否根据对象属性推导函数返回的不同类型?
TypeScript根据字段属性推导返回值类型
当然可以实现!通过TypeScript的条件类型、映射类型,再配合as const断言保留字面量类型信息,就能精准推导someFunction的返回值类型。
1. 给原始数据添加as const断言
首先必须给data加上as const,让TypeScript把数组元素识别为具体的字面量类型,而不是宽泛的string:
const data = { field1: { values: ['a', 'b', 'c'] }, field2: { values: ['c', 'd', 'e'], multiple: true } } as const;
2. 定义类型转换工具
先写一个工具类型,根据字段是否包含multiple: true来决定返回单个字面量还是字面量数组:
type FieldToValueType<T> = T extends { multiple: true } ? T['values'][number][] : T['values'][number];
逻辑很直白:如果字段有multiple: true,就返回其values元素的数组类型;否则返回单个元素的联合类型。
3. 用映射类型生成最终返回类型
再通过映射类型遍历原数据的所有键,把每个字段转换为对应的目标类型:
type FieldsType<T> = { [K in keyof T]: FieldToValueType<T[K]>; };
4. 实现someFunction
最后实现函数,让它的返回值自动适配上面的类型:
function someFunction<T extends Record<string, { values: readonly string[] }>>(data: T): FieldsType<T> { // 这里写实际的转换逻辑,示例逻辑仅供参考 return Object.fromEntries( Object.entries(data).map(([key, field]) => { return [key, field.multiple ? [...field.values] : field.values[0]]; }) ) as FieldsType<T>; }
最终效果
此时const fields = someFunction(data)的类型会被自动推导为:
{ field1: "a" | "b" | "c"; field2: ("c" | "d" | "e")[]; }
完全符合预期。
内容的提问来源于stack exchange,提问作者ciscoheat
相关产品推荐
相关产品推荐

