Зачем вам указывать тип экспорта (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).

Итак, зачем указывать тип экспорта?


person André Pena    schedule 20.12.2015    source источник


Ответы (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: Default exports are a bit special in that regard. The export default … declaration does indeed allow you to directly export the value of an expression (or an anonymous function/function*/class declaration), but behind the scenes it actually does create a local variable in your module with the name *default*.

person Bergi    schedule 20.12.2015

Объявление переменных, функций или новых константных значений не имеет ничего общего с экспортом. Поведение var, let или const внутри модуля отличается, поэтому вам нужно указать, что это такое. Если вы экспортируете его или нет, это другое дело.

Значения неизменяемы снаружи модуля, но не внутри (например, из другой экспортируемой функции).

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

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

вы комбинируете объявление переменной с экспортом модуля с кодом вроде

export const x = 10;

так же, как вы не можете объявить переменную только с

x = 10;

вы не можете объявить переменную, а затем назначить ее именованному экспорту с помощью

export x = 10;

Вот что вы можете сделать:

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

По сути, это просто разделение логики объявления переменных и экспорта модулей именования.

person low_ghost    schedule 20.12.2015

Если ваш экспорт используется по умолчанию, вам не нужно указывать имя или тип того, что вы экспортируете, поэтому вы можете сделать:

export default "whateveryoulike";

но именованные экспорты разные, вам нужно указать имя переменной, чтобы вы могли импортировать ее по этому имени (тип не важен):

const x = "whateverelse";
const y = "onemore";
export {x, y as z};
person madox2    schedule 20.12.2015