使用打字稿编译AMD时出错

时间:2013-11-29 16:17:49

标签: compiler-construction requirejs typescript amd openlayers-3

我目前遇到的打字稿编译问题。

我正在使用OpenLayers(3.0.0 Beta 1)上的最新版本,我尝试将其集成到我的AMD模块中。我确切地说我并不熟悉AMD机制和打字稿。

为了管理我的地图,感谢OpenLayers3,我正在创建一个新模块:

OlMap.ts

/// <reference path="../_import.ts" />

import ol = require('ol');

/*
*   Custom class used to wrap the OpenLayers Map class.
*   This is used to extend the functionnalities (i.e. controls)
*   Defined following the chaining method pattern.
*
*   @module OlMap
*   @class
*/
class OlMap {
      // My code here
}

为了更容易使用OpenLayers3(不是AMD),我创建了一个名为 ol3.d.ts 定义文件,它被引用到我的_import.ts中

我的问题是,当我尝试编译时,我收到错误:

OlMap.ts<3.1> error TS2071: Unable to resolve external module ''ol''
OlMap.ts<3.1> error TS2072: Module cannot be aliased to a non-module type.

编译文件如下:

/// <reference path="../_import.ts" />
define(["require", "exports", 'ol'], function(require, exports, __ol__) {
    var ol = 'ol';

但它应该更像是:

/// <reference path="../_import.ts" />
define(["require", "exports", 'ol'], function(require, exports, __ol__) {
    var ol = __ol__;

如果我手动编辑生成的javascript文件,就像前面的代码一样(var ol = __ ol __),我没有依赖项问题,但生成的文件会因编译错误而产生错误。

有什么想法吗? 感谢

编辑: 我将OpenLayer javascript文件集成到HTML中。 OpenLayer不是AMD库,所以我使用的是RequireJS的Shim。

3 个答案:

答案 0 :(得分:1)

我假设您在index.html中明确包含openLayers3的JS文件(即不使用requireJS)。在这种情况下,您可以通过在根文件夹中创建名为ol.ts的文件(require查找它)并将以下内容放入其中来解决问题:

/// <reference path="./path/to/ol.d.ts" />

export = ol;

这应该以AMD友好的方式重新导出OpenLayers的window.ol对象。

答案 1 :(得分:1)

您需要将其声明为外部加载的模块。即:

declare module 'ol'{
    var openlayers:any;
    export = openlayers;
}

import ol = require('ol');


class OlMap {
      // My code here
}

生成:

define(["require", "exports", 'ol'], function(require, exports, __ol__) {
    var ol = __ol__;

    var OlMap = (function () {
        function OlMap() {
        }
        return OlMap;
    })();
});

答案 2 :(得分:0)

好的,我找到了解决方案。

我没有从相关的AMD模块加载OL3,而是尝试将其加载到应用程序引导程序中,就像我为AngularJS和jQuery所做的那样。 垫片机制看起来很有效。

尽管如此,我仍然不知道为什么Typescript构建器拒绝编译我的应用程序。 谢谢你的帮助。