TypeScript interne moduler på tværs af flere filer
Antag følgende klassedefinition ved brug af TypeScript i Animal.ts:
module Animals
{
export class Animal { }
}
Hvis jeg vil oprette en Hund-klasse i en separat fil, for eksempel i Dog.ts, ved at bruge denne kode:
module Animals
{
export class Dog extends Animal { }
}
fejlmeddelelsen jeg får i klasse definition Dog er, at navnet "Animal" ikke eksisterer i det aktuelle omfang.
Tilføjelse af følgende linje til Dog.ts
/// <reference path="Animal.ts"/>
rettet kompileringsfejlen, men hvorfor er dette nødvendigt, hvis begge klasser bliver defineret inden for samme modul?
Med andre ord vil jeg have, at modulet erklæringer strækker sig over flere filer, med hver klasse- eller grænseflade-definition i deres egen fil. Er dette overhovedet bedste praksis?
Svar #1
Først og fremmest, hvis du kompilerer begge filer på én gang ved hjælp af
tsc Animal.ts Dog.ts
alt vil være fint. Når man kompilere Typescript-filer, skal compileren gøres opmærksom på, hvilke filer der faktisk udgør programmet. Dette kan gøres ved at bruge kildehenvisninger med /// eller ved at give alle filer til compileren. Dette er lidt anderledes end andre sprog som java, som kompilerer til en mellemliggende repræsentation og har en opfattelse af en CLASSPATH, hvor man kan søge efter andre filer, der er en del af programmet.
Svar #2
///-referencen er nødvendig, fordi compileren på en eller anden måde skal vide, hvor Animal er defineret. Den kan ikke vide, hvilken kildefil det er i, uden at du fortæller den, hvor den skal kigge.
Jeg er ikke sikker på, at dette er en bedste praksis i sig selv (jeg ville have brug for at vide mere om din applikation), men jeg tror næppe, det er et anti-mønster, så jeg synes, du kan føle dig fri til at gøre det. Moduler i TypeScript er bevidst åbne for at tillade denne slags mønster.
