Почему вы должны указать тип экспорта (let, var, const...) в ES2015?
Как я читаю здесь, 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).
Итак, почему вы должны указать тип экспорта?
4 ответа
Вам не нужно указывать тип экспорта - вы должны указать тип локальной привязки в вашем модуле.
должны быть названы экспорт и экспорт по умолчанию.
Есть:
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*
,
Объявление переменных, функций или новых константных значений не имеет ничего общего с экспортом. Поведение var, let или const в модуле отличается, поэтому вам нужно указать, что это такое. Если вы экспортируете это или нет, это другое дело.
Значения являются неизменяемыми снаружи модуля, но не изнутри (например, из другой экспортируемой функции).
export let mutable = 1;
export const immutable = 2;
export function change() {
mutable = 11; //works
immutable = 22; //throws, the value is const
}
Если ваш экспорт установлен по умолчанию, вам не нужно указывать имя или тип экспортируемого файла, поэтому вы можете сделать следующее:
export default "whateveryoulike";
но именованные экспорты отличаются, вы должны указать имя переменной, чтобы вы могли импортировать ее под этим именем (тип не важен):
const x = "whateverelse";
const y = "onemore";
export {x, y as z};
Вы объединяете объявление переменной с экспортом модуля с кодом, подобным
export const x = 10;
так же, как вы не можете объявить переменную только с
x = 10;
Вы не можете объявить переменную и затем назначить ее именованному экспорту с помощью
export x = 10;
Вот что вы можете сделать:
const x = 10;
const y = (arg) => arg + 10;
export { x, y };
По сути, это просто разделение логики объявления переменных и экспорта модуля именования.