En navngivningskollision opstår, når to eller flere kodekomponenter bruger det samme navn til en variabel, funktion eller klasse. De er almindelige i store projekter, hvor mange mennesker arbejder på den samme kodebase. De kan gøre det svært at afgøre, hvilken kodekomponent der er ansvarlig for fejl.
Ved at bruge navneområder kan du organisere og administrere din kode, så grupper af relaterede komponenter er under en fælles identifikator. Dette vil mindske risikoen for navnekonflikter.
Oprettelse af et navneområde
Du kan oprette navnerum i TypeScript ved hjælp af navneområde søgeord. Følg den med en identifikator for at navngive navneområdet og en blok omgivet af krøllede klammeparenteser. Syntaksen ligner den, du ville bruge til oprette en klasse i JavaScript.
For eksempel:
navneområde Eksempel {}
Du kan derefter erklære medlemmer af navneområdet – variabler, funktioner og klasser – inden for navnerumsblokken:
navneområde Eksempel {
eksportfungereFoo(): ugyldig{
konsol.log("Dette er en funktion i eksempelnavnerummet");
}eksportklasse Bar {
ejendom: snor;konstruktør(ejendom: snor) {
det her.ejendom = ejendom;
}
}
eksportkonst baz = "Dette er en navnerumsvariabel"
}
I eksemplet ovenfor, Foo, Bar, og baz er medlemmer af Eksempel navneområde. Som standard kan du kun få adgang til medlemmerne af et navneområde inden for det samme navneområde. Brug eksport nøgleord for at gøre hvert medlem af navneområdet tilgængeligt uden for det.
Du kan få adgang til alle offentligt tilgængelige medlemmer af et navneområde ved at kalde navnerummets medlemsnavn ved hjælp af punktnotation:
Eksempel.foo(); // Dette er en funktion i eksempelnavnerummet
konst bar = ny Eksempel. Bar("snor");
konsol.log (bar.property); // streng
konsol.log (Eksempel.baz); // Dette er en navnerumsvariabel
Indlejring af navnerum
TypeScript giver dig mulighed for at indlejre navnerum i andre navnerum for at skabe en hierarkisk struktur for din kode. Indlejring af navneområder kan yderligere reducere risikoen for navnekollisioner ved at gruppere relaterede navnerum under en fælles identifikator.
For eksempel:
navneområde Eksempel {
eksportkonst ejendom_1 = "Foo";eksportnavneområde Bar {
eksportkonst printFoo = fungere () {
konsol.log (egenskab_1);
};
}eksportnavneområde Baz {
eksportklasse Foo {
ejendom: snor;
konstruktør(ejendom: snor) {
det her.ejendom = ejendom;
}
}
}
}
Kodeblokken ovenfor giver et eksempel på et indlejret navneområde. Det Eksempel navneområde er navnerummet på øverste niveau, der indeholder Bar navneområde og Baz navneområde.
Du kan få adgang til egenskaberne i et indlejret navneområde ved hjælp af punktnotation, der følger den hierarkiske struktur, du har oprettet.
For eksempel:
konsol.log (Example.property_1); // Foo
Eksempel. Bar.printFoo() // Foo
konst foo = ny Eksempel. Baz. Foo("eksempel")
Denne eksempelkode får adgang til hvert medlem af navneområdet via det overordnede navneområde. Adgang til en ejendom direkte, i stedet for gennem dens overordnede navneområde, ville give en fejl:
Eksempel.printFoo()
// fejl TS2339: Egenskaben 'printFoo' findes ikke på typen 'typeof Eksempel'
Selvom indlejrede navnerum kan hjælpe dig med at organisere din kode, kan dybt indlejrede navnerum give den modsatte effekt. Dybt indlejrede navnerum gør din kode sværere at læse og vedligeholde.
Namespace Aliaser
Et navneområdealias er et forkortet navn givet til et navneområdemedlem, hvilket gør det nemmere at referere.
Du kan oprette et navnerumsalias ved hjælp af importere nøgleord efterfulgt af det navn, du vil tildele aliaset. Tildel derefter importere nøgleord og aliasnavnet til et navneområdemedlem.
For eksempel:
navneområde Bil {
eksportnavneområde Tesla {
eksportklasse ModelX {
skab(): Snor {
Vend tilbage"Model X oprettet".
}
}
}eksportnavneområde Toyota {
eksportklasse Camry {}
}eksportnavneområde Ford {
eksportklasse Mustang {}
}
}// Oprettelse af alias
importere tesla = bil. Tesla
konst modelX = ny tesla. ModelX()
modelX.create() // Model X Oprettet
Dette eksempel opretter et alias for Bil. Tesla navneområde. Du kan bruge dette alias til at få adgang til egenskaber for Tesla navneområde, som ModelX-klassen, nemmere.
Brug af navnerum i flere filer
For at bruge et navneområde i en anden fil, skal du importere det. Import af navnerum er forskellig fra import af variabler, funktioner, klasser osv. Afhængig af dit projekt modulsystem, kan du importere dem ved hjælp af enten kræve eller den importere søgeord.
Du kan dog kun importere navnerum ved at bruge triple-slash-direktivet, som er en enkeltlinjekommentar, der indeholder et XML-tag.
For eksempel:
// main.ts
///
Eksempel.foo()
Dette eksempel bruger det tredobbelte skråstreg-direktiv inde i en main.ts fil. Direktivet henviser til indeks.ts fil, som indeholder Eksempel navneområde. Uden import er navneområdet kun tilgængeligt i den samme fil, som definerer det.
Efter at have refereret til indeks.ts fil, kan du få adgang til Eksempel navneområde og dets offentligt tilgængelige medlemmer. Du kan for eksempel ringe til foo metode på Eksempel navneområde.
Når du har brugt flere filer, skal du sikre dig, at TypeScript kompilerer og indlæser al den nødvendige kode. Du kan gøre det ved at sammenkæde output fra TypeScript-kompileren ved hjælp af udfil mulighed. Dette vil så kompilere alle inputfilerne til en enkelt JavaScript-outputfil. Den generelle syntaks for at køre compileren som denne er:
tsc --outFile
Erstatte med navnet på din JavaScript-målfil. Erstatte med navnet på TypeScript-filen, der indeholder triple-slash-direktivet.
For eksempel:
tsc --outFile index.js main.ts
Denne kommando vil kompilere indholdet af main.ts fil, sammen med alle de filer, der henvises til af direktivet om tredobbelt skråstreg, i index.js fil.
Alternativt kan du angive hver fil individuelt:
tsc --outFile
Det er vigtigt at bemærke, at triple-slash-direktivet kun er gyldigt, når det erklæres øverst i en fil. Hvis du prøver at bruge det andre steder, vil TypeScript behandle det som en almindelig kommentar på én linje uden nogen særlig betydning.
Skal du bruge navnerum eller moduler?
Selvom navnerum ikke er forældet, anbefales det ofte at organisere og administrere din kode ved hjælp af ES6-moduler. Moduler er nemmere at vedligeholde og administrere, og du kan anvende dem på tværs af flere filer.
Derudover kan du specificere relationerne mellem moduler med hensyn til import og eksport på filniveau. Navneområder kan ikke definere deres afhængigheder.
I sidste ende vil valget mellem navnerum og moduler afhænge af dit projekts specifikke behov og krav, da begge tilbyder en værdifuld måde at organisere og administrere kode i TypeScript.