Экспорт гибридного типа и модуля

В течение нескольких месяцев я успешно разрабатывал 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 как об ошибке?


person Simone Gianni    schedule 08.08.2015    source источник


Ответы (1)