modul - TypeScript: Hvordan bruke intern grensesnitt innenfor navnerom
Jeg har et grensesnitt som jeg bare vil bruke innenfor et navnerom (internt modul) og det skal ikke brukes utenfor navnerommet.
Eksempelgrensesnitt:
namespace Test {
interface IInterface {
getId(): number;
getName(): string;
}
}
Dessverre får jeg en feil når jeg prøver å implementere dette grensesnittet innenfor samme namespace hvis jeg ikke eksporterer grensesnittet (noe jeg ikke ønsker).
Implementerende klasse:
namespace Test {
class Implementer implements IInterface {
private location: Location;
public getId(): number {
return 1;
}
public getName(): string {
return "implementer name";
}
}
}
Som gir: TS2304: Kan ikke finne navnet 'IInterface'. i 'Implementer.ts'.
Merk det private medlemmet av typen 'Location', som også er en ny type/klasse definert av meg selv i samme navnerom, og det er den faktiske grunnen til å bruke navnerom fordi typen 'Location' allerede eksisterer i det globale rommet.
Klasse med konfliktende navn hvis brukt utenfor navnerom:
namespace Test {
class Location {
private name: string = null;
constructor(name: string) {
this.name = name;
}
}
}
I tillegg: Jeg bruker ikke noen moduler og jeg konverterer noen typer fra JavaScript til TypeScript-klasser. Å bruke /// <reference path="IInterface.ts" />-hjelperen fungerer ikke (og er ikke problemet her). Jeg ønsker heller ikke å introdusere noen modul-loader.
Så hvordan bruker jeg mitt grensesnitt i samme navnerom uten å eksportere det?
Svar #1
Jeg svarer først på det siste spørsmålet: "Klasse med konfliktende navn hvis brukt utenfor navnerom". Et globalt objekt Location eksisterer allerede i nettleseren. Du kan bruke dette navnet for klassen din i et modul eller i et navnerom. Ellers må du velge et annet navn.
Da vil du dele et namespace. Bare export medlemmet IInterface for å gjøre det tilgjengelig utenfor IIFE-en:
namespace Test {
export interface IInterface {
getId(): number;
getName(): string;
}
}
Forklaring
Fra håndboken:
Navnerom er enkelt sagt navngitte JavaScript-objekter i det globale navnerommet.
Her er en illustrasjon (se koden i TS Playground):
namespace Test {
export let name = 'abc'
}
namespace Test {
let message = 'Hello, ' + name;
}
Etter kompileringen, her er JavaScript-koden:
var Test;
(function (Test) {
Test.name = 'abc';
})(Test || (Test = {}));
var Test;
(function (Test) {
var message = 'Hello, ' + Test.name;
})(Test || (Test = {}));
Navnerommet Test er et "enkelt navngitt JavaScript-objekt i det globale navnerommet". Du kan observere at variabelen message ikke kunne gjenbrukes utenfor sin IIFE. Selv om vi oppretter en tredje IIFE for den samme globale variabelen (navnerommet) Test.
