В течение нескольких месяцев я успешно разрабатывал TypeScript, используя классы с «прикрепленными» модулями во внешних модулях CommonJS следующим образом:
exports = JQ;
class JQ {
a = 0;
}
module JQ {
export class HelpClass {}
export interface Something {}
}
Мне нравится этот шаблон, потому что он создает модули, содержащиеся в файлах, уменьшает количество импортов и по-прежнему предоставляет хороший API.
Теперь вместо экспорта класса я хочу экспортировать гибридный тип, чтобы его можно было использовать как функцию, имеющую другие функции и классы «внутри», как, например, jQuery, Underscore и многие другие библиотеки.
Я знаю, как объявить и как создать гибридный тип в TypeScript, но не могу экспортировать его с прикрепленным модулем. Я получаю правильный сгенерированный код JS, но компилятор жалуется.
Например, это:
export = JQ;
var JQ = <JQ.JQStatic>function (a:string) { return a; };
JQ.method = function() { return 1; };
module JQ {
export interface JQStatic {
(a:string):string;
method() :number;
}
// Additional class here
export class SomethingElse {}
}
Создает то, что выглядит как правильный код JS (выглядит точно так же, как сгенерированный, если бы JQ был классом, а не гибридным типом), но компилятор выдает ошибку дублирующего идентификатора, и intellisense перестает работать.
Если я удалю дополнительный класс SomethingElse
, он будет работать правильно, поэтому я полагаю, что это особый случай для экспорта гибридного типа.
Я также протестировал его на игровой площадке TypeScript и получил те же результаты: несмотря на то, что class JQ
и var JQ
оба испускают var JQ
в JS, когда класс TypeScript разрешает и принимает его, в противном случае нет.
То, что я пытаюсь сделать, не поддерживается? Однако, поскольку выпущенный JS действителен, то есть это функция уже в компиляторе, следует ли сообщать об этом разработчикам TypeScript как об ошибке?