2017-01-25 54 views
0

例如,我有香草JS的AMD模块(未由tsc触摸):如何将TypeScript ES6默认导入映射到AMD模块的返回值?

// 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 

当我编译我的打字稿模块到AMD格式tsc并在我的RequireJS环境中运行时,出现错误default是不确定的,因为打字稿编译为:

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

我不希望它抢default财产。我希望它能处理一个默认导入,就像它只是获取我定义模块的返回值。我的项目中的每个模块都是define()模块,或者是编码为define()(AMD)的打字稿模块。我只想获得那个返回对象。

有没有办法(配置)呢?

编辑:

我知道我可以import * as Foo from './Foo',但就是有点哈克,并生成错误,因为该声明的模块没有叫出口。如果可能的话,我想要一个非错误的方式来做到这一点。

编辑:我了解到我可以做

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

达到的效果。唯一的问题是它不是ES6兼容的。这意味着如果我们告诉打印机保持原样离开ES6导入语句,那么其他工具就不会理解打印机特定的导入/导出语句。我需要一种合理使用官方ES6模块语法的方法。

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

回答

0

尝试

import * as Foo from './Foo' 
+0

这是一个有趣的方式来获得富。如果我有'tsc'忽略错误并且仍然发出一个包,那就行了。但是有错误,因为'.d.ts'文件看起来就是这样(参见更新后的问题)。还有什么建议? – trusktr

+0

噢,我想'import Foo = require('./ Foo')'可以工作,但它不是ES6,所以如果代码曾经用于其他TS只编译语言但仅保留模块语法的环境中,工作。还是会呢? – trusktr