Подтвердить что ты не робот

Импортировать в объект?

Начнем с примера:

import renewCreepLife from '../tasks/renew_creep_life';
import harvestEnergy from '../tasks/harvest_energy';
import pickupEnergy from '../tasks/pickup_energy';
import storeEnergy from '../tasks/store_energy';
import upgradeController from '../tasks/upgrade_controller';

const taskFuncs = {
    [Tasks.RENEW]: renewCreepLife,
    [Tasks.PICKUP_ENERGY]: pickupEnergy,
    [Tasks.HARVESTING]: harvestEnergy,
    [Tasks.STORING]: storeEnergy,
    [Tasks.UPGRADING]: upgradeController,
};

Есть ли способ упростить это, чтобы я не создавал эти бессмысленные временные имена переменных? Что-то вроде:

// incorrect but desired syntax
const taskFuncs = {
    [Tasks.RENEW]: import '../tasks/renew_creep_life',
};

N.B. каждый из этих файлов использует export default function()

4b9b3361

Ответ 1

Нет. Оператор import не имеет возвращаемого значения, поэтому он никогда не может использоваться для прямого назначения такой переменной.

Кроме того, import и export должны быть объявлены на верхнем уровне.

Это невозможно в ES6 и, вероятно, останется в обозримом будущем (ES2016 +).

Тем не менее, существует спецификация HTML-модуля загрузчика HTML, которая позволит вам загружать такие модули, как:

System.import('../tasks/renew_creep_life')
.then(renewCreepLife => {

});

Но поскольку он основан на обещании, вы все равно не сможете просто написать его встроенным в такой объект.

Если вы хотите синхронную загрузку, NodeJS 'require, вероятно, будет ближе всего к вам. Существуют версии браузера, такие как Webpack/Browserify/etc. которые пытаются имитировать поведение:

const taskFuncs = {
    [Tasks.RENEW]: require('../tasks/renew_creep_life').default
};