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