Maszynopis: Wiele projektów w roztworze

głosy
10

Skończyłem Porting biblioteki JavaScript, żeby maszynopis w Visual Studio 2012. W sumie jest około 60 klas, a każda klasa zdefiniowana w pliku własne .TS.

Wszystkie klasy są zdefiniowane w tym samym module. Używam komentarze odniesienia do Reder do klas zdefiniowanych w innych plikach. Układ każdego pliku wygląda następująco:

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

module MyModule {

    export class MyClass {
        ...
    }

}

Teraz mam stworzył drugi projekt w tym samym roztworze, który będzie rzeczywistą aplikacji przy użyciu mojego nowo przeportowany bibliotekę. Muszę to jakoś moją bibliotekę i myślę, że to, co system jest moduł. Jednak nie jestem pewien, co plik (i) do importu jako mymodule jest rozłożona na kilkadziesiąt plików. Czy to, co mogę użyć pliku .d.ts za?

Ponadto, aby móc importować modułu, musi zostać uznane za „wywóz” hasła, ale jeśli to zrobię, to nie zostanie uznane przez komentarze referencyjnych więcej.

Na szczycie tego wszystkiego, że oba projekty powinny być zestawiane tak, że wyjście kompilator może być łatwo wykorzystane z ładowaczem modułu jak requireJS.

Co to jest najlepszym podejściem do osiągnięcia tego wszystkiego?

Dziękuję Ci!

Utwórz 07/10/2012 o 16:41
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
9

Ok, więc pozwól mi zacząć od stwierdzenia, że ​​„Module” może oznaczać różne rzeczy. Na przykład, nie jest „moduł wzór”, który jest jaki jest twój „mymodule” tworzy. O ile mi zebrać, maszynopis odnosi się do nich jako „Moduły Wewnętrznych” w specyfikacji języka, a różnią się one od „zewnętrznych modułów”, które można byłoby loading z czymś RequireJS. Główna różnica jest taka, że ​​moduły zewnętrzne oczekiwać, aby mieć swój własny odizolowane środowisko z obiektu predefiniowanego „eksportu” mogą wykorzystać do eksportowania ich funkcjonalność.

Spójrz na wyjściu modułu:

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

Widać, że eksportuje rzeczy do „mymodule”, które zostaną wykonane globalnie dostępny do innego skryptu załadować pliki z, na przykład, html „skrypt” bloku. Jako, że wspomniałeś masz 60 z nich, prawdopodobnie można również ustawić kompilator wyjściu pojedynczy plik, który mógłby zawrzeć w znacznikach, zamiast ładowania każdy plik pojedynczo.

Idąc dalej, spójrz na to, co dzieje się na wyjściu jeśli zmienisz swoją deklarację z modułu „moduł mymodule {...}” do „modułu eksportu mymodule {...}”:

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

Jak widać, Twój moduł jest nadal za pomocą modułu „wzór”, ale jest on przypisany jako członek „eksportu”, co oznacza, że ​​ma być załadowany, na przykład, węzła „wymagają” funkcję.

W tym przypadku, co chcesz rzeczywiście korzystać z modułu z tym kodem:

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

Zauważ, że „./MyModule” Nazwa rzeczywiście odnosi się do nazwy pliku (minus rozszerzeniem .js) moduł jest zdefiniowany w (dlatego VS mówił, że nie mógł znaleźć te moduły dla Ciebie). Kod powinien skompilować do czegoś takiego:

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

Aby dodać do tego, nie ma już nawet naprawdę trzeba zrobić coś z „modułem” słowo kluczowe aby mieć moduł. można po prostu wyeksportować funkcję:

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

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

To działa, ponieważ funkcja „foo” zostanie bezpośrednio przypisane do „eksportu”, która będzie aliasem „wrapper” w innym pliku.

Aby dodać dodatkowo na ten zagmatwany bałagan modułów związanych z rzeczy, należy również wspomnieć, że moduły AMD nadal są różne, ponieważ są one ładowane asynchronicznie, w odróżnieniu od węzła „wymagać”. Aby dostać się do wyjścia maszynopis te trzeba przekazać w parametrze „--module AMD” do kompilatora.

W każdym razie, mam nadzieję, że wyjaśniłem sytuację na tyle dobrze, do tego stopnia, że ​​będziesz w stanie dowiedzieć się, co dokładnie trzeba / chcesz. Typ modułów skończyć się przy użyciu naprawdę zależy od tego jak będziesz używać ich ... tzn, węzeł sieci, lub jakąś mieszankę obu.

Odpowiedział 07/10/2012 o 20:22
źródło użytkownik

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