Ошибка слияния и экспорта в TypeScript - PullRequest
0 голосов
/ 05 июля 2018

Я работаю над приложением, которое использует TS и OpenLayers. Я пытаюсь построить дерево зависимостей, чтобы во все приложения я помещал операторы импорта и экспорта в мои файлы * .ts.

У меня есть файл 'openlayers.ts', который расширил базовую библиотеку OpenLayers. Например, расширено пространство имен взаимодействия openlayers.

Мой openlayers.ts выглядит так:

declare namespace ol {

    namespace interaction {
        interface someEvent {
            ...
        }

        class myExtendedClass extends ol.interaction.Pointer {
            ...
        }
    }
}

Я знаю, что ol namespace из базовой библиотеки OpenLayers и мой расширенный ol namespace будут объединены. Документация по TypeScript четко описывает, как объединять пространства имен.

Но моя проблема возникла, когда мне пришлось экспортировать мое расширенное пространство имен, потому что оно используется в моем приложении, а до экспорта - приложение не увидело мое расширенное пространство имен.

Мой openlayers.ts теперь выглядит так:

export declare namespace ol {

    ...
}

Как вы можете видеть в моем ol namespace, у меня есть myExtendedClass, который нужно расширить ol.iteraction.Pointer (от базовых OpenLayers).

Но теперь, когда я экспортировал свое пространство имен, приложение не знает, что это такое ol.interaction.Pointer. Итак, я пришел к выводу, что мне нужно импортировать базовые OpenLayers в мой файл, и теперь мое приложение будет определять, что такое ol.interaction.Pointer.

Мой openlayers.ts теперь выглядит так:

import ol = require('openlayers');

export declare namespace ol {

    ...
}

но теперь у меня есть ошибки:

  1. (TS) отдельные объявления в объединенной декларации 'ol' должны быть все экспортированы или все локальные.
  2. В свойстве ol.interaction.Pointer - (TS) «Указатель» не существует для типа «взаимодействие типа».
  3. (TS) Объявление импорта конфликтует с локальным объявлением 'ol'

Я действительно не знаю, что мне делать. Я только начал с TS, и эти ошибки не говорят мне слишком много.

Любые предложения?

1 Ответ

0 голосов
/ 05 июля 2018

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

Было несколько проблем.

  1. Первым из них было то, что я не понимал, как будут работать мои расширения пространства имен. Я действительно не знал, следует ли мне аннулировать эти расширения из моего файла openlayers.ts или из глобальной ссылки OpenLayers. Но я прочитал документацию по TS еще несколько раз, и я искал некоторые решения в Интернете, и после прочтения я понимаю, что если я хочу расширить некоторое пространство имен - я должен аннулировать эти расширения, как это будет в оригинальной библиотеке. Он работает как обычная строка или набор расширений, написанных на C #. Я не должен аннулировать MyStringExtenstion.SomeMethod (myString). Я должен аннулировать myString.SomeMethod ();
  2. Мне не нужно импортировать OpenLayers в мой файл openlayers.ts - это сила слияния пространств имен - если пространства имен имеют одинаковые имена - это будет слияние - и все. Поэтому я удалил import ol = require('openlayers');
  3. Последней проблемой этого сценария был экспорт моего расширенного пространства имен. Теперь, когда я думаю об этом, я вижу, как это было глупо, потому что, если я объединил свои пространства имен с глобальными пространствами имен OpenLayers, мне не нужно экспортировать его еще раз. Мои пространства имен были в глобальных пространствах имен OpenLayers - и все. Поэтому я изменил export declare namespace ol на declare namespace ol.

Я оставлю свой вопрос и отвечу человеку, у которого будет похожая проблема. Я позволю найти решение гораздо быстрее, чем нашел.

...