为啥必须在 ES2015 中指定导出的类型(let、var、const...)?

Posted

技术标签:

【中文标题】为啥必须在 ES2015 中指定导出的类型(let、var、const...)?【英文标题】: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)。

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

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于为啥必须在 ES2015 中指定导出的类型(let、var、const...)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们需要在 bindParam() 中指定参数类型?

为啥我必须在 Java 正则表达式中指定整个字符串? [复制]

为啥在列名中指定主/外键属性

为啥在你依赖自我存在的区块中指定 [unowned self]?

ES6随笔--各数据类型的扩展--函数

Javascript ES6 导出 const 与导出 let