Ошибка компиляции AMD с машинописным текстом

В настоящее время у меня возникла проблема с компиляцией машинописного текста.

Я использую последнюю версию 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__;), у меня нет проблем с зависимостями, но сгенерированный файл создает ошибки из-за ошибки компиляции.

Любые идеи ? Спасибо

Изменить: я не интегрирую файл javascript OpenLayer в HTML. OpenLayer не является библиотекой AMD, поэтому я использую прокладку RequireJS.


person Adrien Saunier    schedule 29.11.2013    source источник


Ответы (3)


Вам нужно объявить его как загружаемый извне модуль. то есть:

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;
    })();
});
person basarat    schedule 29.11.2013
comment
Спасибо за Ваш ответ. Я уже определил новую версию OpenLayers (вдохновленную проектом github.com/borisyankov/DefinentyTyped) с помощью файл .d.ts. После нескольких тестов мой код работает так, как ожидалось, но ошибка определенно связана с сборкой tsc. Я не знаю почему, но когда я помещаю объявление в отдельный файл (на мой файл определения есть ссылки), tsc не работает. - person Adrien Saunier; 02.12.2013

Я предполагаю, что вы явно включаете JS-файл openLayers3 в свой index.html (т.е. не используете requireJS). В этом случае вы можете решить проблему, создав файл с именем ol.ts в корневой папке (где require его ищет) и поместив в него следующее:

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

export = ol;

Это должно повторно экспортировать объект window.ol OpenLayers удобным для AMD способом.

person musically_ut    schedule 29.11.2013
comment
Спасибо за Ваш ответ. Фактически, я пытаюсь удалить файл OpenLayers3 js из index.html и использовать вместо него RequireJS. С ссылками на файлы в HTML это работало, но это проблема для дальнейшей работы. - person Adrien Saunier; 29.11.2013
comment
@AdrienSaunier Вы все равно можете захотеть сохранить файл, чтобы удовлетворить Typescript, позволяя require / r.js обрабатывать внешние библиотеки через прокладки. - person musically_ut; 29.11.2013

Хорошо, я нашел решение.

Вместо того, чтобы загружать OL3 из соответствующего модуля AMD, я попытался загрузить его при начальной загрузке приложения, как это было сделано для AngularJS и jQuery. Механизм прокладки выглядит исправным.

Тем не менее, я до сих пор не знаю, почему построитель Typescript отказался компилировать мое приложение. Спасибо за вашу помощь.

person Adrien Saunier    schedule 02.12.2013