为什么“导出默认常量”无效?

新手上路,请多包涵

我看到以下内容很好:

const Tab = connect( mapState, mapDispatch )( Tabs );
export default Tab;

但是,这是不正确的:

export default const Tab = connect( mapState, mapDispatch )( Tabs );

然而这很好:

export default Tab = connect( mapState, mapDispatch )( Tabs );

这可以解释一下为什么 constexport default 无效?这是不必要的添加吗?任何声明为 export default 的东西都被假定为 const 之类的?

原文由 Kayote 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 867
2 个回答

const 就像 let 一样, 它是一个 LexicalDeclaration ( VariableStatement, Declaration ) 用于在你的块中定义一个标识符。

您正在尝试将其与 default 关键字混合,该关键字 需要 HoistableDeclaration、ClassDeclarationAssignmentExpression 跟随它。

因此它是一个 SyntaxError


如果你想 const 一些东西,你需要提供标识符而不是使用 default

export 本身接受一个 变量 声明或 _声明_。


以下为精细 export default Tab;

Tab 变成了一个 AssignmentExpression ,因为它被命名为 default?

export default Tab = connect( mapState, mapDispatch )( Tabs ); 很好

这里 Tab = connect( mapState, mapDispatch )( Tabs ); 是一个 AssignmentExpression


更新: 想象问题的另一种方式

如果您试图从概念上理解这一点并且上面的规范推理没有帮助,请将其视为 “如果 default 是合法标识符而不是保留令牌,那么编写 export default Foo;export default const Foo = 1; ?”

在这种情况下,扩展的编写方式将是

// pseudocode, this thought experiment is not valid JS

 export default Foo;
 // would be like
 export const default = Foo;

 export default const Foo = 1;
 // would be like
 export const default const Foo = 1;
 // so would the following line make sense?
 const bar const Foo = 1;

有一个有效的论点,扩展 应该

// pseudocode, this thought experiment is not valid JS

 export default const Foo = 1;
 // would be like
 const Foo = 1;
 export const default = Foo;

但是,根据 Sergey 的评论,这将变得模棱两可,因此明确地编写此模式更有意义。

原文由 Paul S. 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果你想导出默认的 const/let,你也可以做这样的事情,而不是

const MyComponent = ({ attr1, attr2 }) => (<p>Now Export On other Line</p>);
export default MyComponent

你可以做这样的事情,我个人不喜欢。

 let MyComponent;
export default MyComponent = ({ }) => (<p>Now Export On SameLine</p>);

原文由 Adeel Imran 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏