为啥必须在 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 允许你导出var
、const
、let
、function
、class
和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 default
时,您指定类型吗?不,你没有,它有效。此外,导出var
或let
有什么区别?对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...)?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我必须在 Java 正则表达式中指定整个字符串? [复制]