ES6 - 是否有一种优雅的方法来导入所有命名导出但不导入默认导出?

25

我希望找到一种优雅的方式来导入所有命名导出,而不必也导入默认的。

在一个文件中,我导出了许多命名常量以及一个默认值:


// myModule.js
const myDefault = 'my default' 
export const named1 = 'named1' 
export const named2 = 'named2'
// many more named exports - otherwise this would not be an issue...
export default myDefault 

在另一个文件中,我希望有一种优雅的方式来仅导入所有命名导出,而无需导入默认值:

// anotherFile.js
// this is what I would like to do, but syntax is not supported, right?
import { * as namedOnly } from './myModule'
不想
// anotherFile.js
import myDefault, * as namedOnly from './myModule' 

因为我不需要anotherFile.js中的默认设置,并且我的代码检查工具会警告我有定义但未使用的myDefault。我也不想:

// anotherFile.js
import {
  named1,
  named2,
  ... // many more
} from './myModule'

因为打字太多了。我也不想使用object.omit的默认值:

// anotherFile.js
import omit from 'object.omit'
import * as all from './myModule'
const namedOnly = omit(all, 'default')

感谢任何帮助!


我不相信有更短的语法来表达这个。 - Joe Clay
目前 ES 规范中没有允许这样做的语法。 - varbrad
2
你对 import * as myModule from './myModule' ; 中的 myModule.named1 等有什么主要关注点?从技术上讲,myModule.default 存在,但你不必使用它。问题的一部分是默认导出实际上是一个命名导出,只是命名为 default - loganfsmyth
2
@loganfsmyth 我的“关注点”是,我想循环遍历所有命名导出项,而不必删除/忽略default... - mcmunder
导入的预期功能不清楚。您是希望将命名导出作为单独的变量,还是作为模块名称空间对象的属性?您的示例似乎混合了这两种方式。 - Bergi
显示剩余2条评论
2个回答

39

“命名导出”和“默认导出”之间没有区别。默认导出是一种命名导出,只是它的名称恰好为 default,这是某些语法为了使用方便而特殊处理的。

导入所有已导出的键的唯一方法是:

import * as foo from "foo";

如果有默认的导出项default,它也将被包括在内。如果你希望从检查中排除它,那么处理这个问题就取决于你自己的逻辑,就像你在omit()示例中所做的一样。

Translated:

如果有默认的导出项default,它也将被包括在内。如果你希望从检查中排除它,那么处理这个问题就取决于你自己的逻辑,就像你在omit()示例中所做的一样。


你如何将foo转换为对象?显然它是模块类型。 - tonix
1
@tonix 你可以将其所有属性复制下来。这取决于为什么它是一个模块对象而不是一个普通对象的原因。 - loganfsmyth

0

好的,我正在使用 Lodash!https://lodash.com/docs/4.17.15#omit

import * as MDATA from './Modules.DATA.store';
{ defaultModuleData: _.map(_.omit(MDATA, ['default']), (ModClass) => new ModClass()) }

我不是很喜欢它,而且它也不太高效,但是没有其他选择!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接