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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:55:21