1

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

我在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__;

如果我像以前的代码(var ol = __ ol__;)一样手动编辑生成的 javascript 文件,我没有依赖关系问题,但生成的文件由于编译错误而产生错误。

有任何想法吗 ?谢谢

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

4

3 回答 3

1

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

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

export = ol;

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

于 2013-11-29T16:24:25.550 回答
1

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

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;
    })();
});
于 2013-11-29T22:06:00.733 回答
0

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

我没有从相关的 AMD 模块加载 OL3,而是尝试在应用程序引导程序中加载它,就像我对 AngularJS 和 jQuery 所做的那样。垫片机制看起来工作。

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

于 2013-12-02T14:03:09.170 回答