Typescript: proiecte multiple în soluție

voturi
10

Am terminat portarea o bibliotecă JavaScript pentru mașina de scris în Visual Studio 2012. Toate în toate aproximativ 60 de clase sale, cu fiecare clasă definită în dosarul său propriu TS.

Toate clasele sunt definite în același modul. Folosesc comentarii de referință Reder la clase definite în alte fișiere. Formatul fiecărui fișier arată astfel:

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

module MyModule {

    export class MyClass {
        ...
    }

}

Acum am creat un al doilea proiect în aceeași soluție care va fi aplicarea efectivă folosind biblioteca mea recent portat. Trebuie să includă biblioteca mea într-un fel și cred că asta e ceea ce sistemul modul este pentru. Cu toate acestea, eu nu sunt sigur ce fișier (e) pentru a importa ca MyModule se întinde pe zeci de fișiere. Este ceea ce se poate folosi fișierul .d.ts pentru?

De asemenea, pentru a putea importa un modul, acesta trebuie să fie declarată cu cuvântul cheie „export“, dar dacă aș face asta, atunci nu mai este găsit de comentarii de referință.

Pe partea de sus a tot ceea ce, ambele proiecte ar trebui să fie compilate, astfel încât ieșirea compilator poate fi utilizat cu ușurință cu un încărcător modul cum ar fi requireJS.

Care este cea mai bună abordare pentru a realiza toate acestea?

Mulțumesc!

Întrebat 07/10/2012 la 16:41
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
9

Ok, așa că lasă-mă să încep prin a spune că „Modulul“ poate însemna lucruri diferite. De exemplu, există „modelul modulului“ care este ceea ce creează dvs. „MyModule“. În ceea ce am aduna, typescript se referă la acestea ca „Module interne“ în spec limbă, iar acestea diferă de la „Module externe“ pe care le-ar fi de încărcare cu ceva de genul RequireJS. Distincția principală este că modulele externe se așteaptă să aibă propriul lor mediu izolat cu un obiect predefinit „exporturi“, care le pot folosi pentru a exporta funcționalitatea lor.

Uitați-vă la ieșirea modulului dumneavoastră:

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

Vezi că exportă lucruri în „MyModule“, care va fi disponibil la nivel global pentru alte script fișierele pe care le încărcați cu, de exemplu, un html „script“ bloc. Fiind că ați menționat aveți 60 dintre acestea, ai putea, probabil, de asemenea, seta compilator la ieșire un singur fișier pe care ați putea include în marcaj, în loc de încărcare fiecare fișier unul câte unul.

Trecând mai departe, să ia o privire la ceea ce se întâmplă la ieșire dacă vă schimbați declarația modulului dvs. de la „modulul MyModule {...}“ la „modul de export MyModule {...}“:

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

După cum vedeți, modulul este încă utilizați „modelul modulului“, dar acesta este atribuit ca membru al „exporturi“, ceea ce înseamnă că acesta este menit să fie încărcat cu, de exemplu, nod „necesită“ funcția.

În acest caz, v-ar dori să utilizați de fapt, modulul cu acest cod:

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

Notă „./MyModule“ numele de fapt , se referă la numele fișierului (minus extensia .js) , modulul este definit în (acesta este motivul pentru VS a fost spunând că nu a putut găsi acele module pentru tine). Codul ar trebui să compileze la ceva de genul:

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

Pentru a adăuga la acest lucru, nu mai chiar și într-adevăr nevoie de a face ceva cu „modul“ cuvânt cheie pentru a avea un modul. Ai putea exporta pur și simplu o funcție:

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

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

Acest lucru funcționează pentru că funcția „foo“ vor fi atribuite în mod direct la „exporturi“, care va fi alias cu „înveliș“ în celălalt dosar.

Pentru a adăuga în continuare pe această mizerie confuz de lucruri legate de modul, ar trebui, de asemenea, menționez că modulele AMD sunt diferite în continuare, deoarece acestea sunt încărcate în mod asincron, spre deosebire de nod „necesită“. Pentru a ajunge la ieșire typescript cei pe care va trebui să treacă într-un parametru „--module AMD“ compilator.

Oricum, sper am explicat situația suficient de bine la punctul vei putea da seama ce anume ai nevoie / de cautare. Tipul de module va ajunge folosind va depinde într-adevăr de modul în care vei folosi ei ... adică, nod, web sau unele amestec de ambele.

Publicat 07/10/2012 la 20:22
sursa de către utilizator

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