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

TypeScript对象参数函数重载:如何根据asObject属性推断返回类型?

如何根据对象参数的属性值推断TypeScript函数返回类型

我来帮你搞定这个类型推断问题!你现在的函数重载没法精准区分asObject为true或false时的返回类型,因为Options里的asObject是宽泛的boolean类型,TypeScript没法识别调用时传入的具体字面量值。要实现需求,咱们得用泛型捕获属性的具体类型+条件类型动态返回结果,直接看修改后的代码:

interface MyMap<T> { [id: string]: T; }

// 定义泛型Options,让asObject的类型是具体的布尔字面量(true/false)
type Options<AsObject extends boolean = false> = {
  asObject: AsObject;
  other?: Function;
};

// 用泛型约束+条件类型指定返回值
function get<AsObject extends boolean = false>(
  options: Options<AsObject> = { asObject: false, other: () => {} } as Options<AsObject>
): AsObject extends true ? MyMap<any> : any[] {
  if (options.asObject) {
    return {} as MyMap<any>;
  }
  return [] as any[];
}

// 测试类型推断效果:
const resultTrue = get({ asObject: true }); // 类型自动推断为MyMap<any>
const resultFalse = get({ asObject: false }); // 类型自动推断为any[]
const resultDefault = get(); // 默认返回any[]

关键逻辑说明:

  1. 泛型捕获具体类型:通过<AsObject extends boolean>,我们让TypeScript捕获调用时传入的asObject的字面量值(而不是宽泛的boolean类型),比如传入true就捕获AsObject = true,传入false就捕获AsObject = false。
  2. 条件类型动态返回:用AsObject extends true ? MyMap<any> : any[]这个条件类型,根据捕获到的AsObject值,动态指定函数的返回类型。
  3. 默认值类型对齐:默认参数的asObject是false,所以给泛型设置默认值= false,同时用类型断言as Options<AsObject>让默认参数的类型和泛型对齐,避免类型报错。

如果你不想预先定义泛型的Options类型,也可以直接在函数参数里动态捕获对象类型,写法更简洁:

interface MyMap<T> { [id: string]: T; }

function get<O extends { asObject: boolean }>(
  options: O = { asObject: false, other: () => {} } as O
): O["asObject"] extends true ? MyMap<any> : any[] {
  if (options.asObject) {
    return {} as MyMap<any>;
  }
  return [] as any[];
}

这种写法直接通过泛型O捕获传入的整个对象类型,再通过O["asObject"]获取asObject属性的具体类型,同样能实现精准的类型推断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:33:48