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

2022-08-29 22:43:16

我看到以下内容很好:

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 defaultexport defaultconst


答案 1

const就像 ,它是一个词法声明变量声明,声明),用于定义块中的标识符。let

您正在尝试将此关键字与关键字混合,该关键字需要一个可提升的声明、类声明赋值表达式来跟踪它。default

因此,它是一个语法错误


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

export本身接受变量声明声明的权利。


以下很好export default Tab;

Tab成为赋值表达式,因为它被赋予了默认的名称

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

下面是一个赋值表达式Tab = connect( mapState, mapDispatch )( Tabs );


更新:以不同的方式想象问题

如果您试图从概念上理解这一点,并且上面的规范推理没有帮助,请将其视为“如果默认值是合法标识符而不是保留令牌,那么编写导出默认值Foo会有什么不同;并导出默认 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的评论,这将变得模棱两可,因此明确地编写此模式更有意义。


答案 2

如果你想导出默认值一个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>);