【问题标题】:Why to you have to specify the type of the export (let, var, const...) in ES2015?为什么必须在 ES2015 中指定导出的类型(let、var、const...)?
【发布时间】:2016-03-26 16:05:34
【问题描述】:

因为我是reading here,ES2015 允许你导出varconstletfunctionclassdefault

export var myVar1 = ...;
export let myVar2 = ...;
export const MY_CONST = ...;

export function myFunc() {
    ...
}
export function* myGeneratorFunc() {
    ...
}
export class MyClass {
    ...
}

但我不明白为什么。在我的外行看来,应该有named exportsdefault exports

您要导出的类型似乎并不重要。我的意思是,当您export default 时,您指定类型吗?不,你没有,它有效。此外,导出varlet 有什么区别?对export const 有什么影响?当您导入一个模块时,它无论如何都是不可变的(AFAIK)。

那么,为什么要指定导出的类型呢?

【问题讨论】:

    标签: javascript commonjs node-modules ecmascript-6


    【解决方案1】:

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

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

    有:

    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 … 声明确实允许您直接导出表达式(或匿名函数/函数*/类 声明)的值,但在幕后它实际上确实在您的名为*default*的模块。

    【讨论】:

      【解决方案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
      }
      

      【讨论】:

        【解决方案3】:

        您正在将变量声明与模块导出与代码相结合

        export const x = 10;
        

        就像你不能只声明一个变量一样

        x = 10;
        

        你不能声明一个变量,然后将它分配给一个命名的导出

        export x = 10;
        

        你可以这样做:

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

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

        【讨论】:

          【解决方案4】:

          如果您的导出是默认的,您不必指定要导出的名称或类型,因此您可以这样做:

          export default "whateveryoulike";
          

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

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

          【讨论】:

            猜你喜欢
            • 2019-08-27
            • 2019-12-01
            • 1970-01-01
            • 2016-03-16
            • 1970-01-01
            • 2018-06-20
            • 1970-01-01
            • 2020-05-23
            • 1970-01-01
            相关资源
            最近更新 更多