如何通过JSDoc从函数返回值推断并分配类型?
获取异步函数返回类型(不调用函数)
你遇到的问题其实是没用到TypeScript/JSDoc标准的类型工具函数,咱们可以用ReturnType结合typeof来实现不调用函数就能获取返回类型,甚至还能解析异步函数返回的Promise内部类型,具体方法如下:
核心方案:用ReturnType<typeof 函数名>获取返回类型
因为你的函数是异步函数,它的直接返回值是一个Promise,所以分两种场景处理:
1. 获取Promise类型的返回值
如果需要的是函数本身返回的Promise类型,可以直接用:
/** @type {ReturnType<typeof getFood>} */ let foodPromise;
此时foodPromise的类型会被推断为Promise<{fruit: string; qty: number;}>,和你调用getFood()得到的类型完全一致,但不会执行函数。
2. 获取Promise解析后的实际数据类型
如果想要的是Promise最终resolve的对象类型(也就是你手动写的{fruit: string, qty: number}),可以用Awaited工具类型来解析Promise:
/** @type {Awaited<ReturnType<typeof getFood>>} */ let foodData;
这样foodData的类型就是{fruit: string; qty: number;},完全自动推断,不用手动写类型。
完整示例代码
async function getFood(){ const food = await {fruit: 'banana', qty: 3} return food } // 场景1:获取Promise类型 /** @type {ReturnType<typeof getFood>} */ let foodPromise; // 类型:Promise<{fruit: string; qty: number;}> // 场景2:获取Promise解析后的实际类型 /** @type {Awaited<ReturnType<typeof getFood>>} */ let foodData; // 类型:{fruit: string; qty: number;}
为什么之前的方法不行?
你用的returnOf不是标准的类型工具,TypeScript/JSDoc里没有这个内置类型,而ReturnType是官方提供的用来提取函数返回类型的工具,配合typeof getFood来获取函数的类型,就能准确拿到它的返回值类型。
另外要确保你的VSCode已经开启了JavaScript的类型检查(可以在项目根目录创建jsconfig.json,添加"checkJs": true配置),这样VSCode就能正确识别这些类型工具并给出类型提示。
内容的提问来源于stack exchange,提问作者JakeDK
相关产品推荐
相关产品推荐

