为什么必须在ES2015中指定导出类型(let,var,const ...)?

时间:2015-12-20 12:49:58

标签: javascript ecmascript-6 commonjs node-modules ecmascript-2015

reading here,ES2015允许您导出varconstletfunctionclass和{{ 1}}。

default

但我不明白为什么。在我的外行看来,应该有export var myVar1 = ...; export let myVar2 = ...; export const MY_CONST = ...; export function myFunc() { ... } export function* myGeneratorFunc() { ... } export class MyClass { ... } named exports

您导出的类型似乎并不重要。我的意思是,当你default exports时,你是否指定了类型?不,你没有,它的工作原理。另外,导出export defaultvar会有什么不同?它与let有什么区别?导入模块时,无论如何它都是不可变的(AFAIK)。

那么,为什么必须指定导出的类型?

4 个答案:

答案 0 :(得分:6)

您不必指定导出的类型 - 您必须在模块中指定本地绑定的类型。

  

应该有命名导出和默认导出。

有:

export {localX as exportedX};
export {localX as default};

您提供的所有这些示例实际上都是简写,它们都声明一个局部变量并以相同的名称导出它:

var myVar1 = …;
let myVar2 = …;
const MY_CONST = …;
function myFunc() {
    …
}
function* myGeneratorFunc() {
    …
}
class MyClass {
    …
}

export {
    myVar,
    myVar2,
    MY_CONST,
    myFunc,
    myGeneratorFunc,
    myClass
};
  

它对export const有何不同?导入模块时,无论如何都是不可变的。

您无法在模块中重新分配。导出不会导出值 1 ,它会将绑定导出到您的本地变量。实际上,进口不是一成不变的,它们只是不可写的。

// example.js
export var value; // this one would not work with `const`
export default function(x) {
    value = x;
}

// main.js
import write, {value} from 'example';
console.log(value); // undefined
write(42);
console.log(value); // 42

1:在这方面,默认出口有点特殊。 export default …声明确实允许您直接导出表达式的值(或匿名函数/函数* / class 声明),但在幕后它实际上创建了一个局部变量在您的模块中,名称为*default*

答案 1 :(得分:2)

声明变量,函数或新的const值与导出没有任何关系。 var,let或const的行为在模块中是不同的,因此您需要指出它是什么。如果你输出或不输出是另一回事。

值是从模块外部不可变的,但不是来自内部(例如来自另一个导出函数)。

export let mutable = 1;
export const immutable = 2;

export function change() {
    mutable = 11; //works
    immutable = 22; //throws, the value is const
}

答案 2 :(得分:1)

如果您的导出是默认导出,则不必指定导出内容的名称或类型,因此您可以执行以下操作:

export default "whateveryoulike";

但命名导出是不同的,您必须指定变量名称,以便您可以使用此名称导入它(类型并不重要):

const x = "whateverelse";
const y = "onemore";
export {x, y as z};

答案 3 :(得分:1)

您正在将变量声明与模块导出组合在一起,例如

export const x = 10;

与您不能仅使用

声明变量的方式相同
x = 10;

您无法声明变量,然后使用

将其分配给指定的导出
export x = 10;

以下是您可以做的事情:

const x = 10;
const y = (arg) => arg + 10;
export { x, y };

这实际上只是将变量声明和命名模块导出的逻辑分开