разница между экспортом по умолчанию {имя} и именованным экспортом {имя} - PullRequest
0 голосов
/ 09 апреля 2019

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

const Foo = () => 'foo';
const Bar = () => 'bar';

export { Foo };
export { Bar };

, что хорошо при потреблении через:

import { Foo, Bar } from './something';

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

Форма становится примерно такой:

const something = {};
Object.defineProperty(something, 'Foo', {
  get(){
    console.warn('Foo is deprecated soon');
    return Foo;
  }
});
// etc
export default something;

Я думал, что деструктивный импорт это выяснит так

import { Foo, Bar } from './something';

... продолжит работать как прежде. Вместо этого webpack жалуется, что у чего-то нет именованного экспорта Foo или Bar

использование этого, однако, работает:

const { Foo, Bar } = require('./something');

У меня также может быть import something from './something'; const { Foo, Bar } = something, и это работает, но это не отвечает цели, если мне приходится реорганизовывать каждый существующий импорт.

Таким образом, вопрос на самом деле заключается в том, как работает import { Foo, Bar } from './something'; по сравнению с require() - я бы подумал, что если экспорт по умолчанию - это объект, он выяснит это и деструктурирует, но нет радости

Есть ли простой способ сделать это «проксирование», не меняя способ потребления экспорта в другом месте?

1 Ответ

1 голос
/ 09 апреля 2019

Я думаю, что заставил это работать. Не забывайте, что это обходной путь.

Учитывая, что вы сказали, что библиотека «реэкспортируется» из одного файла, вы можете добавить дополнительный «слой» к «реэкспорту», ​​где мы превращаем файл «реэкспорта» в файл JS и напишите наш собственный связанный файл для него.

Рабочая репутация: https://repl.it/@Olian04/CelebratedKlutzyQuotes

Фрагменты кода:

// index.ts
// consuming the library
import { Foo } from './demo';

console.log(Foo());
// library.ts
// the library it self
const Foo = () => 'foo';

export { Foo }
// demo.js
// the workaround implementation 
const depricatedLibrary = require('./library');

const something = new Proxy(depricatedLibrary, {
  get(obj, key) {
    if (typeof key === 'string') {
      console.warn(key + ' is deprecated soon');
    }
    return obj[key];
  }
});

module.exports = something;
// demo.d.ts
// the workaround types
export * from './library';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...