首页 > 解决方案 > 为什么我不能“导出默认值”一个与其定义一致的常量?

问题描述

我可以定义一个函数,然后导出为默认值,将其定义为内联导出,或者定义它并将其导出为默认内联:

function myFunc() {
    ...
}
export default myFunc;
export function myFunc2() {
    ...
}
export default function myFunc3(param) {
    ...
}

我可以定义一个类然后导出为默认值,定义它并将其导出为内联,或者定义它并将其导出为默认内联:

class MyClass {
    ...
}
export default MyClass;
export class MyClass2 {
    ...
}
export default class MyClass3 {
    ...
}

很酷,所以类和函数是一致的。现在,常量:

定义然后导出为默认值:

const myConst = 42;
export default myConst;

定义和导出内联:

export const myConst = 42;

那些很好。但我无法定义它并将其导出为默认内联:

export default const myConst = 42; // nope -- syntax error!

我的问题:为什么在这方面常量与类和函数不同?它们都是可导出的,都可以作为默认值导出。为什么我不能用常量内联?

我发现为什么 `Export Default Const` 无效?谷歌搜索时。我相信提问者试图问我同样的问题,但有一个高度赞成、接受的答案并没有回答我的问题。我不是问编译器拒绝语法的技术原因。我希望了解为什么这种语言是这样设计的。

如果有帮助,答案可能是“如果支持这种语法,[事情] 会发生”或“它曾经以这种方式工作,但我们删除了它,因为 [事情] 发生了”或“有一个开放的关于将其添加到规范中的讨论,请参见 [此处]。”

如果 TypeScript 和 JavaScript 之间的区别与答案有任何关联,请澄清。

标签: javascripttypescriptes6-modules

解决方案


看看为什么 JavaScript 有默认导出。它们是作为语法糖引入的:

export default function example() {}
// is the same as
function example() {}
export { example as default }
export default class Example {}
// is the same as
class Example {}
export { Example as default }
export default (expression);
// is the same as
let *default* = (expression);
export { *default* as default }

export不是你可以贴在任何声明上的修饰符,它是一种单独的声明语句。

默认导出/导入旨在简化模块以微不足道的名称导出单个函数或类的常见用例(这就是它们甚至允许匿名声明的原因)-创建整个模块(或只是遵循Java“每个类一个文件”模式)。常量值不是您通常会为其创建自己的模块的东西,因此它没有特殊的语法糖。一起去

const myConst = 42;
export { myConst as default};

或(如果您实际上不需要本地名称)

export default 42;

推荐阅读