ES6+默认导出的隐式命名方式有哪些?含编辑器识别问题
ES6+ 中默认导出的隐式命名方式汇总
默认导出本身没有强制命名要求,但以下几种隐式命名方式能被编辑器识别,用于自动补全和自动导入:
- 先将值赋值给具名变量,再导出默认:
const Foo = 'foo'; export default Foo; - 直接导出具名函数:
export default function namedFunction() { /* ... */ } - 模块文件名也会被当作默认导出的隐式名称。
遇到的问题
在维护的代码库中有大量类似如下的代码:
function Factory(...) { /* ... */ } export default Object.assign(Factory, { dependencies });
尽管导出值的.name属性确实为Factory,但VSCode、带LSP的Emacs等编辑器无法识别该名称,无法提供自动导入功能。尝试过JSDoc注释辅助但无效,同时也无法使用以下嵌套声明的方案:
function FactoryInner(...) { /* ... */ } const Factory = Object.assign(FactoryInner, { dependencies }); export default Factory;
已有@VilgotanL提出的可行方案:
function Factory(...) { /* ... */ } Object.assign(Factory, { dependencies }); export default Factory;
以下补充几种ES6+环境下的其他可行方式:
其他可行的隐式命名方案
- 使用具名函数表达式直接传入
Object.assign
将具名函数直接写在Object.assign的第一个参数位置,让编辑器通过静态分析识别函数名称:
export default Object.assign(function Factory(...) { /* ... */ }, { dependencies });
- 使用显式别名导出默认
先修改函数对象,再通过别名将其作为默认导出,明确告知编辑器导出的名称:
function Factory(...) { /* ... */ } Object.assign(Factory, { dependencies }); export { Factory as default };
- 利用IIFE返回具名函数
通过立即执行函数表达式修改并返回具名函数,保持导出语句简洁的同时保留可识别的名称:
export default (function Factory(...) { Object.assign(Factory, { dependencies }); return Factory; })();
- 直接声明具名变量并导出
如果允许直接声明变量的写法(非嵌套FactoryInner的形式),可以直接将处理后的函数赋值给具名变量再导出:
const Factory = Object.assign(function(...) { /* ... */ }, { dependencies }); export default Factory;
内容的提问来源于stack exchange,提问作者Arnaldur
相关产品推荐
相关产品推荐

