export default导出函数后,import返回对象而非函数致测试失败
问题原因及解决方案
问题根源
当使用await import(source)动态导入模块时,无论模块用export default还是命名导出,返回的都是模块命名空间对象。你测试用的示例文件通过export default syncFn导出函数,这个函数会挂载在模块对象的default属性上,而非直接作为import的返回值。你的代码直接把模块对象当成函数判断和调用,自然触发了"TODO - not a function"错误。
解决方案
有两种可行的修复方式:
方式一:修改getResult函数,提取默认导出
在获取模块对象后,取出其default属性作为目标函数,修改后的代码如下:
const getResult = async function (source: string): Promise<unknown> { let module; try { module = await import(source); } catch (error) { throw error; } // 提取默认导出的函数 const resultFunction = module.default; if (typeof resultFunction !== 'function') { throw new Error("导出内容不是函数"); } const result = await resultFunction(); return result; }; export { getResult };
方式二:修改示例文件为命名导出
如果想保持getResult函数逻辑不变,可以将测试示例文件改为命名导出:
export const syncFn = function () { return 'sync'; };
同时修改getResult内的判断和调用逻辑,使用对应的命名导出(比如resultFunction.syncFn),不过这种方式灵活性较低,需要提前知晓导出名称。
额外说明
若场景需要同时兼容默认导出和命名导出,可在getResult中增加判断逻辑:先检查模块对象是否有符合要求的命名导出,无则尝试使用default属性,具体逻辑可根据业务需求调整。
内容的提问来源于stack exchange,提问作者baitendbidz
相关产品推荐
相关产品推荐

