Можно ли передать параметры для импорта ES6?
Как вы это переведете:
var x = require('module')(someoptions);
to ES6?
Можно ли передать параметры для импорта ES6?
Как вы это переведете:
var x = require('module')(someoptions);
to ES6?
Невозможно сделать это с помощью одного оператора import
, он не допускает вызовов.
Таким образом, вы не будете вызывать его напрямую, но вы можете сделать то же самое, что делает commonjs с экспортом по умолчанию:
// module.js
export default function(options) {
return {
// actual module
}
}
// main.js
import m from 'module';
var x = m(someoptions);
В качестве альтернативы, если вы используете загрузчик модулей, который поддерживает обещания monadic, вы можете выполнить что-то вроде
System.import('module').ap(someoptions).then(function(x) {
…
});
С новым оператором import
это может стать
const promise = import('module').then(m => m(someoptions));
or
const x = (await import('module'))(someoptions)
однако вам, вероятно, нужен не динамический импорт, а статический.
import x from 'module' use someoptions;
синтаксиса
- person Fabrizio Giordano; 28.04.2015
import {x, y} from 'module'
). Тогда каким должен быть синтаксис, если я хочу передать несколько аргументов? Или выкладывать массив аргументов? Это узкий вариант использования, и в основном вы пытаетесь добавить другой синтаксис для вызова функции, но у нас уже есть вызовы функций, которые позволяют нам иметь дело со всеми другими случаями.
- person Felix Kling; 28.04.2015
var session = require('express-session'); var RedisStore = require('connect-redis')(session);
. Мне просто интересно, есть ли однострочное решение. Я могу полностью выжить, разделив задание RedisStore на 2 строки :)
- person Fabrizio Giordano; 28.04.2015
import {default(someoptions) as x} from 'module'
в ES7, если в этом действительно есть необходимость.
- person Bergi; 28.04.2015
session
/connect-redis
я представлял себе такой синтаксис: import session from 'express-session'); import RedisStore(session) from 'connect-redis'
.
- person Jeff Handley; 19.06.2015
import
:-(
- person RavenHursT; 24.09.2016
const x = (await import(…))(options)
в области модуля. (Все же?)
- person Bergi; 27.05.2017
export default function (GreetingIntroTxt:string) { class Student { name: string; constructor(name: string) { this.name = name; } greet() { return
${GreetingIntroTxt}, + this.greeting; } } return { Student,} }
Это возвращает ошибку: TS4060: возвращаемый тип экспортируемой функции имеет или использует частное имя "класс"
- person TSR; 18.03.2019
Вот мое решение с использованием ES6
Очень похоже на ответ @Bergi, это «шаблон», который я использую при создании импорта, которому нужны параметры, переданные для объявлений class
. Это используется в изоморфной структуре, которую я пишу, поэтому будет работать с транспилером в браузере и в node.js (я использую Babel
с Webpack
):
./MyClass.js
export default (Param1, Param2) => class MyClass {
constructor(){
console.log( Param1 );
}
}
./main.js
import MyClassFactory from './MyClass.js';
let MyClass = MyClassFactory('foo', 'bar');
let myInstance = new MyClass();
Вышеприведенное выведет foo
в консоль
ИЗМЕНИТЬ
В качестве примера из реального мира я использую это для передачи пространства имен для доступа к другим классам и экземплярам в рамках. Поскольку мы просто создаем функцию и передаем объект в качестве аргумента, мы можем использовать ее с объявлением нашего класса следующим образом:
export default (UIFramework) => class MyView extends UIFramework.Type.View {
getModels() {
// ...
UIFramework.Models.getModelsForView( this._models );
// ...
}
}
Импорт немного сложнее и automagical
в моем случае, учитывая, что это целая структура, но по сути это то, что происходит:
// ...
getView( viewName ){
//...
const ViewFactory = require(viewFileLoc);
const View = ViewFactory(this);
return new View();
}
// ...
Надеюсь, это поможет!
MyView
расширяет некоторые элементы, доступные в пространстве имен фреймворка. Хотя вполне возможно просто передать его в качестве параметра классу, это также зависит от того, когда и где создается экземпляр класса; переносимость тогда страдает. На практике эти классы могут быть переданы другим платформам, которые могут создавать их экземпляры по-другому (например, пользовательские компоненты React). Когда класс оказывается вне области действия фреймворка, он по-прежнему может поддерживать доступ к фреймворку при создании экземпляра из-за этой методологии.
- person Swivel; 24.11.2016
На основе ответа @Bergi использовать модуль отладки с использованием es6 будет следующим
// original
var debug = require('debug')('http');
// ES6
import * as Debug from 'debug';
const debug = Debug('http');
// Use in your code as normal
debug('Hello World!');
import * as createPrompt from '../node_modules/prompt-sync'; const prompt = (createPrompt.default ?? createPrompt)();
, поэтому это работает как с командами tsc, так и с ts-node
- person TamusJRoyce; 28.05.2021
Я считаю, что вы можете использовать загрузчики модулей es6. http://babeljs.io/docs/learn-es6/
System.import("lib/math").then(function(m) {
m(youroptionshere);
});
m(youroptionshere)
? Я полагаю, вы могли бы написать System.import('lib/math').then(m => m(options)).then(module => { /* code using module here */})
... но это не очень понятно.
- person Stijn de Witt; 24.03.2016
Вам просто нужно добавить эти 2 строки.
import xModule from 'module';
const x = xModule('someOptions');
xModule
здесь вводит в заблуждение. На самом деле у вас есть import func from 'module'; func('someOptions');
.
- person Dan Dascalescu; 27.09.2019
Я попал в эту ветку в поисках чего-то похожего и хотел бы предложить какое-то решение, по крайней мере, для некоторых случаев (но см. примечание ниже).
Случай использования
У меня есть модуль, который запускает некоторую логику создания экземпляров сразу после загрузки. Мне не нравится вызывать эту логику инициализации вне модуля (что аналогично вызову new SomeClass(p1, p2)
или new ((p1, p2) => class SomeClass { ... p1 ... p2 ... })
и т.п.).
Мне нравится, что эта логика инициализации будет выполняться один раз, своего рода единый поток инстанцирования, но один раз для определенного параметризованного контекста.
Пример
service.js
имеет базовую область применения:
let context = null; // meanwhile i'm just leaving this as is
console.log('initialized in context ' + (context ? context : 'root'));
Модуль А делает:
import * as S from 'service.js'; // console has now "initialized in context root"
Модуль B выполняет:
import * as S from 'service.js'; // console stays unchanged! module's script runs only once
Пока все хорошо: сервис доступен для обоих модулей, но инициализировался только один раз.
Проблема
Как заставить его работать как другой экземпляр и снова инициализировать себя в другом контексте, скажем, в модуле C?
Решение?
Вот о чем я думаю: использовать параметры запроса. В сервисе мы бы добавили следующее:
let context = new URL(import.meta.url).searchParams.get('context');
Модуль C сделает:
import * as S from 'service.js?context=special';
модуль будет повторно импортирован, запустится его базовая логика инициализации, и мы увидим в консоли:
initialized in context special
Примечание: я бы сам посоветовал НЕ практиковать этот подход, а оставить его в крайнем случае. Почему? Модуль, импортированный более одного раза, является скорее исключением, чем правилом, поэтому это несколько неожиданное поведение и, как таковое, может сбить с толку потребителей или даже сломать его собственные «одиночные» парадигмы, если таковые имеются.
System.import(module)
, не уверен, позволяет ли это аргументы или нет, возможно, кто-то, кто знает больше о ES6? - person adeneo   schedule 28.04.2015