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.

Relaterte artikler