Elnevezési ütközés akkor következik be, ha két vagy több kódösszetevő ugyanazt a nevet használja egy változóhoz, függvényhez vagy osztályhoz. Gyakoriak a nagy projektekben, ahol sok ember dolgozik ugyanazon a kódbázison. Megnehezíthetik annak meghatározását, hogy melyik kódkomponens felelős a hibákért.
A névterek használatával rendszerezheti és kezelheti a kódot úgy, hogy a kapcsolódó összetevők csoportjai közös azonosító alatt legyenek. Ez csökkenti az elnevezési konfliktusok kockázatát.
Névtér létrehozása
A TypeScriptben névtereket hozhat létre a névtér kulcsszó. Kövesse azt egy azonosítóval a névtér elnevezéséhez, valamint egy kapcsos zárójelekkel körülvett blokkot. A szintaxis hasonló az Ön által használt szintaxishoz hozzon létre egy osztályt JavaScriptben.
Például:
névtér Példa {}
Ezután deklarálhatja a névtér tagjait – változókat, függvényeket és osztályokat – a névtérblokkon belül:
névtér Példa {
exportfunkcióFoo(): üres{
konzol.log("Ez egy függvény a Példa névtérben");
}exportosztály Rúd {
ingatlan: húr;konstruktőr(ingatlan: húr) {
ez.property = tulajdon;
}
}
exportconst baz = "Ez egy névtérváltozó"
}
A fenti példában Foo, Rúd, és baz tagjai a Példa névtér. Alapértelmezés szerint csak az ugyanazon a névtéren belüli névtér tagjaihoz férhet hozzá. Használja a export kulcsszóval, hogy a névtér minden tagja elérhető legyen rajta kívül.
A névtér összes nyilvánosan elérhető tagjához hozzáférhet, ha a névtér tagnevét pont jelöléssel hívja:
example.foo(); // Ez egy függvény a Példa névtérben
const bár = új Példa. Rúd("húr");
konzol.log (bar.property); // húr
konzol.log (Példa.baz); // Ez egy névtérváltozó
Névterek egymásba ágyazása
A TypeScript lehetővé teszi, hogy névtereket más névterekbe ágyazzon be, hogy hierarchikus struktúrát hozzon létre a kódhoz. A névterek egymásba ágyazása tovább csökkentheti az elnevezési ütközések kockázatát azáltal, hogy a kapcsolódó névtereket egy közös azonosító alá csoportosítja.
Például:
névtér Példa {
exportconst property_1 = "Fú";exportnévtér Rúd {
exportconst printFoo = funkció () {
konzol.log (tulajdonság_1);
};
}exportnévtér Baz {
exportosztály Foo {
ingatlan: húr;
konstruktőr(ingatlan: húr) {
ez.property = tulajdon;
}
}
}
}
A fenti kódblokk példát mutat beágyazott névtérre. A Példa névtér a legfelső szintű névtér, amely tartalmazza a Rúd névtér és a Baz névtér.
A beágyazott névtér tulajdonságait pontjelöléssel érheti el, amely követi az Ön által létrehozott hierarchikus struktúrát.
Például:
konzol.log (Példa.tulajdonság_1); // Foo
Példa. Bar.printFoo() // Foo
const foo = új Példa. Baz. foo("példa")
Ez a példakód a névtér minden tagját a szülő névtéren keresztül éri el. Egy tulajdonság közvetlen elérése, nem a szülő névterén keresztül, hibát okozna:
Példa.printFoo()
// TS2339 hiba: A 'printFoo' tulajdonság nem létezik a 'typeof Example' típuson
Bár az egymásba ágyazott névterek segíthetnek a kód rendszerezésében, a mélyen beágyazott névterek ellenkező hatást válthatnak ki. A mélyen beágyazott névterek megnehezítik a kód olvasását és karbantartását.
Névtér álnevek
A névtér-alias egy névtértagnak adott rövidített név, amely megkönnyíti a hivatkozást.
Létrehozhat egy névtér aliast a import kulcsszó után az aliashoz rendelni kívánt név. Ezután rendelje hozzá a import kulcsszót és az álnevet egy névtértagnak.
Például:
névtér Autó {
exportnévtér Tesla {
exportosztály ModelX {
teremt(): Húr {
Visszatérés"X modell létrehozva".
}
}
}exportnévtér Toyota {
exportosztály Camry {}
}exportnévtér Ford {
exportosztály Mustang {}
}
}// Az álnév létrehozása
import tesla = Autó. Tesla
const modellX = új tesla. ModelX()
modelX.create() // X modell létrehozva
Ez a példa létrehoz egy álnevet a Autó. Tesla névtér. Ezzel az álnévvel elérheti a tulajdonságait Tesla névtér, mint a ModelX osztály, könnyebben.
Névterek használata több fájlban
Ha egy másik fájlban szeretne névteret használni, importálnia kell azt. A névterek importálása eltér a változók, függvények, osztályok stb. importálásától. A projekttől függően modulrendszer, importálhatja őket a igényelnek vagy a import kulcsszó.
A névtereket azonban csak a triple-slash direktíva használatával importálhatja, amely egysoros megjegyzés, amely XML címkét tartalmaz.
Például:
// main.ts
///
example.foo()
Ez a példa a tripla perjel direktívát használja az a-n belül fő.ts fájlt. Az irányelv hivatkozik a index.ts fájlt, amely tartalmazza a Példa névtér. Importálás nélkül a névtér csak ugyanabban a fájlban érhető el, amely meghatározza.
Hivatkozás után a index.ts fájlt, elérheti a Példa névtér és annak nyilvánosan elérhető tagjai. Például felhívhatja a foo módszer a Példa névtér.
Ha több fájlt használ, gondoskodnia kell arról, hogy a TypeScript lefordítsa és betöltse az összes szükséges kódot. Ezt megteheti a TypeScript fordító kimenetének összefűzésével a outFile választási lehetőség. Ez ezután az összes bemeneti fájlt egyetlen JavaScript kimeneti fájlba fordítja. A fordító futtatásának általános szintaxisa a következő:
tsc --outFile
Cserélje ki a cél JavaScript-fájl nevével. Cserélje ki a tripla perjel direktívát tartalmazó TypeScript fájl nevével.
Például:
tsc --outFile index.js main.ts
Ez a parancs összeállítja a fő.ts fájlt, valamint a tripla perjel direktíva által hivatkozott összes fájlt a index.js fájlt.
Alternatív megoldásként minden fájlt külön-külön is megadhat:
tsc --outFile
Fontos megjegyezni, hogy a tripla perjel direktíva csak akkor érvényes, ha a fájl tetején van deklarálva. Ha bárhol máshol megpróbálja használni, a TypeScript normál egysoros megjegyzésként kezeli, különösebb jelentés nélkül.
Névtereket vagy modulokat használjon?
Bár a névterek nem elavultak, gyakran javasolt a kód ES6 modulok segítségével történő rendszerezése és kezelése. A modulokat könnyebb karbantartani és kezelni, és több fájlra is kiterjedhet.
Ezenkívül fájlszinten megadhatja a modulok közötti kapcsolatokat az importálás és az exportálás tekintetében. A névterek nem határozhatják meg függőségeiket.
Végső soron a névterek és modulok közötti választás a projekt sajátos igényeitől és követelményeitől függ, mivel mindkettő értékes módot kínál a kódok TypeScript rendszerben való rendszerezésére és kezelésére.