2016-05-13 2 views
2

У меня есть модуль А, который, какВ противном случае импортировать свойства модуля

const defaults = { 
    something: {...}, 
    somethingElse : {...} 
} 

export { defaults as default }; 

А потом я ввожу как

import * as mod, { something } from 'moduleA'; 

mod правильно объект, который имеет две заявленные свойства, но { something } не определено.

Любая идея, в чем причина?

+0

@nils Почему вы сказали бы, что это недействительно? Мне это хорошо. –

+0

@torazaburo вы правы, я ошибся, я смутил его новым синтаксисом, изложенным в этом предложении: https://github.com/leebyron/ecmascript-more-export-from – nils

ответ

2

[с модулем как в вопросе] Я импортирую как

import * as mod, { something } from 'moduleA'; 

но something не определен

Но вы не экспорт с именем something в модуле. Существует только экспорт по умолчанию, содержащий объект. Вы должны были бы сделать

import mod from 'moduleA'; 
const { something } = mod; 

У меня есть модуль А, который, как

const defaults = { 
    something: {...}, 
    somethingElse : {...} 
} 

export { defaults as default }; 

Но вы действительно не должны делать это в любом случае. Экспорт объектов «singleton», которые действуют как пространство имен, является антипатерном в модулях ES6. Вместо этого вы должны использовать именованный экспорт:

export const something = {...}; 
export const somethingElse = {...}; 

При этом ваша первоначальная попытка импортировать модуль работала бы.

-2

something не экспортируется из вашего модуля A, только объект defaults есть.

Итак, чтобы получить something, вам нужно взять его с того, что вы импортировали.

import * as mod from 'moduleA'; 

const something = mod.something; 

Если вы хотите, чтобы иметь возможность импортировать something как это: import {something} from 'moduleA', вам нужно будет экспортировать его явно. Например:

export const something = {}; 
const somethingElse = {}; 

export default const defaults = { 
    something, 
    somethingElse 
}; 
+0

вам не нужно явно экспортировать импортируйте его, если он является частью экспортируемого объекта, вы можете использовать деконструкцию. –

-1
import * as mod, { something } from 'moduleA'; 

Причина что-то не определен, потому что, когда вы: export { defaults as default }; вы экспортирование элемента с именем по умолчанию. Когда вы export {apple, banana} вы экспортируете член apple и участник banana.

При импорте чего-либо без указания членов, которые вы хотите импортировать, вы импортируете элемент с именем по умолчанию. Когда вы укажете участников, которые вы хотите импортировать, вы, конечно, импортируете их.

Вот почему, хотя ваш код не делать то, что вы собираетесь, следующее:

const mod = { something: 'test'}; 
export { mod as default }; // same as export default mod; 

и

import mod, {default as test} from './index'; // test and mod both have the same values 

console.log(mod); // { something: 'test' } 
console.log(test.something); // test 
0

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

const defaults = { 
    something: {...}, 
    somethingElse : {...} 
} 

export { 
    defaults as default, 
    defaults.something as something, 
    defaults.somethingElse as somethingElse 
}; 

В качестве альтернативы вы можете использовать деструктурирование для экспорт something и somethingElse:

export const { something, somethingElse} = defaults; 

А затем импортировать его, как вы делали:

import * as mod, { something } from 'moduleA'; 

Но: мод теперь будет содержать реквизит: defaults, something, somethingElse.

Если вы только привычка default (который равен ваш defaults):

import mod, { something } from 'moduleA'; 

Вы можете узнать больше о импорта и экспорта синтаксиса ES6 в большом блоге Axel Rauschmayr в:

http://www.2ality.com/2014/09/es6-modules-final.html

+0

'export const {something, somethingElse} = defaults;' похоже недействительно –

+0

Вы правы, я обновил код. – nils

+0

@AvraamMavridis: Почему? Кажется, все прекрасно. – Bergi

Смежные вопросы