Скопируйте объявления функций модуля в глобальное пространство имен

Я объявил около сорока функций внутри модуля, но есть также метод, который копирует каждую функцию в глобальное пространство имен (или любой предоставленный целевой объект).

module JsHamcrest {
    declare function assertThat(actual: any, matcher: Matcher): void;

    // lots and lots of Matcher factory methods
    declare function bool(): Matcher;
    declare function func(): Matcher;
    declare function number(): Matcher;
    declare function object(): Matcher;
    declare function string(): Matcher;
    ...

    declare function copyMembers(target: any): void;
}

Это позволяет разработчикам использовать функции JavaScript в пространстве имен как есть через имя модуля.

JsHamcrest.assertThat(5, JsHamcrest.number());

или скопируйте их в глобальное пространство имен, чтобы улучшить читаемость.

JsHamcrest.copyMembers(window);

assertThat('foo', string());

Самое короткое решение, которое я придумал до сих пор, - назначить каждую функцию глобальной переменной:

var number = JsHamcrest.number;

Но, по крайней мере, в PhpStorm JSDoc не применяется к копиям и по-прежнему подвержен ошибкам (хотя и в меньшей степени).

tl; dr Как я могу объявить эти определения верхнего уровня, не копируя их, и при этом иметь автозаполнение IDE документацией?


person David Harkness    schedule 03.11.2014    source источник


Ответы (1)


Невозможно «массово» скопировать элементы в глобальное пространство имен (к счастью?), Но вы можете использовать import вместо var и должны получить информацию JSDoc, если ваш редактор использует службу языка TypeScript:

введите описание изображения здесь

person Ryan Cavanaugh    schedule 03.11.2014
comment
Импорт работает, но PhpStorm не наследует документацию или подсказку типа параметра (для тех, которые принимают параметры): Type Script Import Statement Impl "bool" [jshamcrest.d.ts]. Однако похоже, что это единственный выход, и я отправлю запрос функции в PhpStorm. - person David Harkness; 04.11.2014
comment
Я полагаю, что вы, вероятно, являетесь высшим авторитетом в этом вопросе, но я оставлю вопрос открытым на один день на случай, если кто-то предложит левостороннее решение. :) - person David Harkness; 04.11.2014
comment
Единственная идея с левым полем, которая у меня есть, заключается в том, что вы пишете одну версию своего объявления (возможно, глобальную), а затем автоматически генерируете упакованную версию файла в качестве копии (просто добавьте ее module JsHamcrest { и завершите ее }) . Вы можете сделать это с помощью командного файла, хотя существуют более изящные методы. Это дает вам одно место для управления объявлениями. Я делаю аналогичный трюк, чтобы заставить код работать как с внутренними, так и с внешними модулями: stevefenton.co.uk/Content/Blog/Date/201411/Blog/ - person Fenton; 04.11.2014
comment
@SteveFenton Я делал аналогичные вещи для других проектов (генерация кода I ‹3) и, вероятно, сделаю это здесь. Я отправил запрос функции для WebStorm (основа плагина для PhpStorm) для всех, кто интересуется . - person David Harkness; 05.11.2014