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

如何为动态函数执行器保留原传入函数的返回类型?

解决方案:用泛型保留原函数返回类型

你需要给funcRunner添加泛型约束,以此捕获传入函数的返回类型,替代原本宽泛的Function类型,让TypeScript能正确推断返回值类型。

基础版本(仅支持异步函数)

修改后的funcRunner代码:

const funcRunner = async <T>(func: () => Promise<T>): Promise<T> => {
  return await func();
};

测试你的示例:

const isExample = async (): Promise<boolean> => true;

const result = await funcRunner(isExample); // result类型自动推断为boolean,不再是any

进阶版本(同时支持同步/异步函数)

如果需要兼容同步函数,可以用Awaited<T>(TypeScript 4.5+支持)自动解析同步值或Promise的内部类型:

const funcRunner = async <T>(func: () => T): Promise<Awaited<T>> => {
  return await func();
};

测试同步/异步场景:

// 同步函数
const syncGetNum = (): number => 123;
const numResult = await funcRunner(syncGetNum); // numResult类型为number

// 异步函数
const asyncGetStr = async (): Promise<string> => "test";
const strResult = await funcRunner(asyncGetStr); // strResult类型为string

原理说明

原来的Function类型是无类型约束的“万金油”,TypeScript无法从中提取具体的返回类型信息。通过泛型<T>,我们让函数在调用时动态捕获传入函数的返回类型,再通过Promise<T>或Promise<Awaited<T>>明确funcRunner的返回签名,从而保留原函数的类型信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:55:56