Динамически оборачивать именованные экспорты дополнительным промежуточным ПО перед экспортом - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть несколько экспортированных функций из модуля ES6, таких как:

export const funA = params => 'hello funA';
export const funB = params => 'hello funB';

Я бы хотел обернуть их перед экспортом:

const wrapper = params => fun => {
  // some extra logic
  Object.assign(params, { extra: 'data' });
  return fun(params);
};

export const funA = wrapper(params => 'hello funA');
export const funB = wrapper(params => 'hello funB');

Это работает так, но я 'Интересно, можно ли определить funA и funB без вызова wrapper способом, аналогичным:

import { mapValues } from 'lodash';

const wrapper = params => fun => {
  // some extra logic
  Object.assign(params, { extra: 'data' });
  return fun(params);
};

const funA = params => 'hello funA';
const funB = params => 'hello funB';

export default mapValues({ funA, funB }, wrapper);

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

Можно ли выполнить именованные экспорты с возможностью динамического переноса их на wrapper связующее ПО?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Если вы хотите избежать повторения wrapper в каждой строке, вы можете использовать присвоение деструктуры и именованный экспорт.Однако для этого необходимо повторить { funA, funB, ..., funXYZ }.

import { mapValues } from 'lodash';

const wrapper = params => fun => {
    // some extra logic
    Object.assign(params, { extra: 'data' });
    return fun(params);
};

let funA = params => 'hello funA';
let funB = params => 'hello funB';

let { funA, funB } = mapValues({ funA, funB }, wrapper);

export { funA, funB };
0 голосов
/ 18 сентября 2018

Где вы собираетесь определить, какое промежуточное программное обеспечение оболочки?

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

export const funA = middleware => params => 'funA'
export const funB = middleware => params => 'funB'

, затем на месте вызова:

import { funA } from './module.js'

const funFunA = middleware(funA)

Но этозвучит все больше и больше как кейс для композиции функций:

import { funA } from './module.js'
import { nextFun } from './other.js'

const funFunA = compose(nextFun, funA)

В зависимости от ваших потребностей это также может стоить вашего использования чего-то вроде Arrow монады

https://evilsoft.github.io/crocks/docs/crocks/Arrow.html

Редактировать:

const _funA = a => b

export const funA = (...args) => {
  switch (currentMood) {
    case 'saucy': return sauce(_funA(...args))
    default: return _funA(...args)
}
...