Контекст
Мы разбиваем наш текущий проект (TypeScript + RequireJS) на отдельные модули (ядро, виджет1, ...). Мы используем TypeScript версии 0.8.1.1.
Каждый модуль собирается в один файл, и изначально загружается ядро. Виджеты будут загружаться лениво, только в случае необходимости, но я хочу убедиться, что виджеты могут ссылаться на мои основные модули (но не включать модуль в свои выходные данные).
Для пояснения при компиляции модулей TypeScript в модули AMD операторы import
будут скомпилированы в массив зависимостей функции define
модуля. Пример:
Машинопись
import coreModule = module("core");
Вывод JavaScript (с флагом AMD)
define(['require', 'exports', 'core'], function(require, exports, __CoreModule__){
var coreModule = __CoreModule__;
});
Это именно то, чего я пытаюсь избежать.
Поэтому я планирую заменить все операторы import someCoreModule = module("core/...");
на операторы var someCoreModule = require("core/...");
.
Проблема
Проблема, с которой я сталкиваюсь, заключается в том, что некоторые из этих основных модулей возвращают базовые классы, которые могут быть расширены с помощью виджетов. Из-за пространства имен в TypeScript это означает, что мне нужно расширить их следующим образом:
import baseClass = module("core/SomeBaseClass");
class Child extends baseClass.Base {
}
И, конечно, мне все еще нужен тот же синтаксис при замене оператора import
оператором require
:
var baseClass = require("core/SomeBaseClass");
class Child extends baseClass.Base {
}
Это, очевидно, приводит к ошибке относительно отсутствующего типа (Base). В настоящее время я планирую обойти эту ошибку, предоставив заглушку реализации базового класса. Следующее:
declare module baseClass {
class Base {
}
}
var baseClass = require("core/SomeBaseClass");
class Child extends baseClass.Base {
}
Хотя это работает, я нахожу это довольно уродливым. Мне нужно иметь возможность расширить класс, так как мне нужны вызовы super
. Это означает, что я не могу использовать интерфейс для ввода необходимого модуля.
Кто-нибудь знает лучшее решение или я вынужден решать свою проблему таким образом?
Как всегда, любая помощь приветствуется!