javascript - TypeScript organisation: namnrymder? moduler? förvirring


Jag är ny på TypeScript och ju mer jag läser om moduler och namnrymder, desto mer förvirrad blir jag. Ska jag använda moduler? Ska jag använda namnrymder? Ska jag använda båda? Hjälp!

Jag har befintliga JavaScript (.js) filer som jag försöker konvertera till TypeScript. Det finns en .js-fil med några allmänna funktioner och en .js-fil med några funktioner specifika för filter.

Nu skulle jag vilja organisera detta lite mer med TypeScript, som jag normalt skulle göra med C#.

Är detta korrekt användning eller hur bör det organiseras?

Jag använder inget modul, borde jag? (hur?)

Företag.ts

namespace Company {

  // nothing yet, but in future it might.

}

Företag.Projekt.ts

namespace Company.Project {

  import Company; // like this?

  let myVar : string = "something";

  export function handyGeneralFunction1(foo, bar) {
    // ...
  }

  export function handyGeneralFunction2(foo, bar, foo, bar) {
    // ...
    doInternalCalc();
    // ...
  }

  export function handyGeneralFunction3() {
    // ...
  }

  function doInternalCalc() {
    // ...
  }
}

Företag.Projekt.Filter.ts

namespace Company.Project.Filter {

    import Project = Company.Project; // like this?

    export function initializeFilter() {
        // ...
        initMetadata();
        // ...
    }

    function initMetadata() {
        // ...
        Project.handyGeneralFunction3();

        let helper : FilterHelper = new FilterHelper("aaaa,bbbb");
        let res:string[] = helper.parseData();
    }

    function foo() {
        // ...
        let x :string = Project.myVar + " else"; // can I use myVar here?
    }

   // a class in the namespace
   export class FilterHelper {

         data: string;

        constructor(theData: string) {
            this.data = theData;
        }

        parseData() : string[] {
             // ...
             return new Array<string>();
        }
   }

}

Svar #1

Om du har möjlighet att verkligen förbättra projektstrukturen bör du definitivt använda moduler istället för namnrymder. Beroende på projektets storlek kan detta kräva en del ansträngning.

Att införa namnrymder kan vara användbart om din app inte är så stor och du inte vill investera i att byta till ett annat byggsystem som kan hantera riktiga moduler. Att använda namnrymder är inte mycket mer än några namngivna globala variabler som innehåller funktionerna och variablerna. Detta kan snabbt bli förvirrande eftersom du inte har några ordentliga beroendestrukturer. Du behöver se till att importera alla filer i rätt ordning för att namnrymdarna ska fungera korrekt. Den importsyntax du använde kan till och med utelämnas, eftersom du ändå bara refererar till ett annat globalt objekt, som behöver initieras vid den tidpunkten.

Så namnrymder kan vara ditt allra första steg om du inte har möjlighet att göra några större förändringar i din kodbas. För en framtidssäker uppsättning skulle jag definitivt föreslå att använda riktiga moduler. Men var medveten om att detta inte kommer gratis.

För ytterligare information föreslår jag att ta en titt på den officiella kommentaren om detta på https://www.typescriptlang.org/docs/handbook/namespaces-and-modules.html eller avsnittet i TypeScript Deep Dive på https://basarat.gitbooks.io/typescript/content/docs/project/namespaces.html

Relaterade artiklar