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

基于可选对象参数推导TypeScript函数返回类型

TypeScript辅助函数根据options参数推导返回类型问题

我有一个接收可选options参数的TypeScript辅助函数,希望根据传入的options参数(结合默认值)推导函数的返回类型。当前实现未做类型推导,始终返回Promise<void>。

期望行为:

  • 当无需返回结果时,返回类型为Promise<void>
  • 当需要返回结果时,返回类型为executionHandler的返回类型对应的Promise<ReturnType>
  • 具体规则由options的awaitExecution和returnResult属性决定(二者默认值均为true)

当前代码实现

type Options = {
  awaitExecution?: boolean;
  returnResult?: boolean;
};

type MaybeAsyncFunction<T> = () => T | Promise<T>;

async function apiCall<ReturnType>(
  executionHandler: MaybeAsyncFunction<ReturnType>,
  options?: Options
) {
  const { awaitExecution = true, returnResult = true } = options ?? {};

  try {
    if (awaitExecution) {
      const result = await executionHandler();
      if (returnResult) {
        return result;
      }
    } else {
      executionHandler();
    }
  } catch (err) {
    /** error handling */
  }

  return;
}

示例调用期望

const executionHandler = () => 'abc';

apiCall(executionHandler); // 应返回Promise<string>
apiCall(executionHandler, { awaitExecution: true }) // 应返回Promise<string>
apiCall(executionHandler, { awaitExecution: false }) // 应返回Promise<void>

尝试过的方案(未成功)

type ApiCallReturnType<T, O> = O extends undefined
  ? T
  : O extends { awaitExecution: true; returnResult: true }
  ? T
  : void;

async function apiCall<ReturnType, Opts extends Options = object>(
  executionHandler: MaybeAsyncFunction<ReturnType>,
  options?: Opts
): Promise<ApiCallReturnType<ReturnType, Opts>> {
  /* try catch */

  return Promise.resolve() as ApiCallReturnType<ReturnType, Opts>; // To return void
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:25:14