导出默认值{name}与命名的export {name}

时间:2019-04-09 14:33:56

标签: javascript webpack ecmascript-6

我试图弃用具有许多命名导出的模块,例如:

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

export { Foo };
export { Bar };

在通过以下方式消费时很好:

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

我关于启用弃用警告的想法是对每个打印弃用然后返回模块的键使用默认的类型对象导出,并带有属性getter覆盖。

然后形状变为:

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 个答案:

答案 0 :(得分:1)

我认为我做到了。请记住,这是一种解决方法。

鉴于您说该库是从单个文件“重新导出”的,则可以在“重新导出”中添加一个附加的“层”,在此我们将“重新导出”文件转换为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';