Машинопись: Несколько проектов в решении

голоса
10

Я закончил портирование библиотеки JavaScript для машинописи в Visual Studio 2012. Все во всех его около 60 классов, причем каждый класс, определенный в файле собственных .ts.

Все классы определены в одном модуле. Я использую справочные комментарии Редер для классов, определенных в других файлах. Расположение каждого файла выглядит следующим образом:

///<reference path='./../myotherclass.ts' />

module MyModule {

    export class MyClass {
        ...
    }

}

Теперь я создал второй проект в том же растворе, который собирается быть реальным приложение, используя мою недавно портирована библиотеку. Я должен включить мою библиотеку как-то, и я предполагаю, что это то, что модульная система для. Тем не менее, я не уверен, что файл (ы) для импорта в качестве MyModule распространяется на десятки файлов. Это то, что я могу использовать файл .d.ts для?

Кроме того, чтобы иметь возможность импортировать модуль, он должен быть объявлен с «экспортном» ключевым словом, но если я что то не нашел ссылочные комментарии больше.

Вдобавок ко всему, что оба проекта должны быть составлены таким образом, что выход компилятор может быть легко использован с модулем погрузчика как requireJS.

Каков наилучший подход для достижения всего этого?

Спасибо!

Задан 07/10/2012 в 16:41
источник пользователем
На других языках...                            


1 ответов

голоса
9

Итак, позвольте мне начать с того, что «Модуль» может означать разные вещи. Например, есть «модуль шаблон», который является то, что создает ваш «MyModule». Насколько я понимаю, машинопись относится к ним как «внутренние модули» в языке спецификации, и они отличаются от «внешних модулей», которые вы бы погрузка что-то вроде RequireJS. Главным отличием является то, что внешние модули рассчитывают иметь свою собственную изолированную среду с объектом предопределенный «экспорта», они могут использовать для экспорта их функциональности.

Посмотрите на выходе модуля:

var MyModule;
(function (MyModule) {
    var MyClass = (function () {
        function MyClass() { }
        return MyClass;
    })();
    MyModule.MyClass = MyClass;    
})(MyModule || (MyModule = {}));

Вы видите, что она экспортирует вещи в «MyModule», которая будет сделана доступной во всем мире к другому скрипту файлов, загружать с, например, «сценарием» блоком HTML. Учитывая то, что вы упомянули, у вас есть 60 из них, вероятно, можно также установить компилятор для вывода одного файла, который вы могли бы включить в разметку, вместо загрузки каждому файлу один за другим.

Двигаясь дальше, посмотрим на то, что происходит на выходе, если вы измените свое объявление модуль из «модуля MyModule {...}» на «экспорт модуля MyModule {...}»:

(function (MyModule) {
    var MyClass = (function () {
        function MyClass() { }
        return MyClass;
    })();
    MyModule.MyClass = MyClass;    
})(exports.MyModule || (exports.MyModule = {}));

Как вы видите, ваш модуль по-прежнему использует «шаблон модуля», но в настоящее время назначен в качестве члена «экспорта», что означает, что она предназначена для загрузки, например, узел «требуют» функции.

В этом случае, вы действительно хотите использовать модуль с этим кодом:

import wrapper = module("./MyModule");
var instance = new wrapper.MyModule.MyClass();

Обратите внимание , что название «./MyModule» на самом деле относится к имени файла (минус .js расширения) модуль определен в (поэтому VS говорил , что это не может найти эти модули для вас). Код должен составить что - то вроде:

var wrapper = require("./MyModule");
var instance = new wrapper.MyModule.MyClass();

Чтобы добавить к этому, вы больше не на самом деле даже не нужно ничего делать с «модулем» ключевым словом, чтобы иметь модуль. Вы можете просто экспортировать функцию:

// foo.ts
export function foo() {
    ...
};

// some other file in the same dir
import wrapper = module("./foo");
var result = wrapper.foo();

Это работает, потому что функция «Foo» будет непосредственно отнесено к «экспорту», ​​который будет псевдонимы в «обертке» в другом файле.

Для того, чтобы добавить дальше на этом запутанном беспорядок модулей, связанные вещей, я должен также отметить, что модули AMD отличается еще потому, что они загружаются асинхронно, в отличие от узла «требует». Чтобы получить Машинопись для вывода этих вам нужно передать параметр «--module AMD» для компилятора.

Во всяком случае, я надеюсь, что я объяснил ситуацию достаточно хорошо, до точки, вы сможете понять, что именно вам нужно / хотят. Тип модулей, которые вы в конечном итоге с помощью действительно зависит от того, как вы будете использовать их ... то есть узел, веб, или какой-либо сочетание обоих.

Ответил 07/10/2012 в 20:22
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more