如何将TypeScript ES6默认导入映射到AMD模块的返回值?

时间:2017-01-25 04:56:33

标签: javascript typescript amd

例如,我在vanilla JS中有一个AMD模块(tsc没有触及):

// Foo.js
define([], function() {
  return class Foo {}
})

附带声明文件:

// Foo.d.ts
declare class Foo {
  // ...
}

export default Foo

然后我有一个打字稿模块:

// app.ts
import Foo from './Foo'
new Foo // Uncaught TypeError: Foo_1.default is not a constructor

当我使用tsc将我的打字稿模块编译为AMD格式并在我的RequireJS环境中运行时,出现了default未定义的错误,因为typescript编译为:

define("app", ["require", "exports", "Foo"], function (require, exports, Foo_1) {
    "use strict";
    console.log(Foo_1["default"]);
});

我不希望它抓住default属性。我希望它处理默认导入,就像它只是抓取我的define模块的返回值。我项目中的每个模块都是define()模块,或者编译为define()(AMD)的打字稿模块。我只想得到那个返回对象。

有没有办法(配置)这个?

编辑:

我知道我可以import * as Foo from './Foo',但这有点hacky,并且它会产生错误,因为声明的模块没有命名导出。如果可能的话,我想要一种非错误的方法。

编辑:我知道我可以做到

// app.ts
import Foo = require('./Foo')
new Foo // no error

实现结果。唯一的问题是它不兼容ES6。这意味着如果我们告诉typescript按原样保留ES6 import语句,那么其他工具将无法理解特定于typescript的导入/导出语句。我需要一种合理使用官方ES6模块语法的方法。

我认为我的解决方案可能只是做一个post-tsc-compile转换步骤来转换默认的导入访问点。

1 个答案:

答案 0 :(得分:0)

尝试

import * as Foo from './Foo'