systemjs - Hur man korrekt importerar samma namnrymd i två olika filer i Typescript


Jag har problem med att förstå hur man skapar två filer med samma namespace och importerar en till den andra i Typescript.

Det här är situationen:

file1.ts

export namespace nspace {
    export class ClassA {

    }
}

file2.ts

import {nspace} from './file1';

export namespace nspace {
    export class ClassB extends nspace.ClassA {
        private z: nspace.ClassA;
    }
}

i fil2 har jag dessa fel:

1) Individuella deklarationer i sammanslagen deklaration 'nspace' måste alla vara exporterade eller alla lokala

2) Egenskapen 'ClassA' finns inte på typen 'typeof nspace'

Dessutom hittas ClassA korrekt när den används för att deklarera typen för fältet z (den tar mig till och med till rätt fil om jag använder "gå till deklaration" i min IDE)
Jag har försökt söka efter det första felet på internet eftersom jag inte riktigt förstår vad det betyder, men ingen av de sidor jag hittade hjälpte. Jag läste dokumentationen om Declaration Merging i Typescript men jag kunde inte hitta en situation som liknar min
Jag vet inte om detta är till någon hjälp, men jag använder SystemJS i min applikation

Svar #1

Det borde vara mycket enklare att använda:

namespace MyApp {
    export class ClassA {
        public a: string = "classA";
    }
}
namespace MyApp {
    export class ClassB extends ClassA {
        private class_a: ClassA = new ClassA();
        private b: string = "classB";
    }
}
namespace MyApp {
  var b = new ClassB();
  console.log(b.class_a.a) // "classA"
}

Kompilatorn kommer att känna igen att du arbetar inom samma namnrymd, så det finns ingen anledning att importera den, eller ens prefixa den.

Även om jag i min uppsättning inte har behövt göra detta, verkar kompilatorn plocka upp saker korrekt automatiskt. (Jag använder en enda OutFile och uteslutningsdirektivet i tsconfig.json)

Det jag tycker är konstigt i detta är att du tvingas exportera ClassA för att den ska kunna upptäckas i min ClassB.ts. Det verkar omöjligt att hålla ClassA och ClassB privata för namespace om jag vill använda dem i Main.ts (även i privata variabler). Det ger helt enkelt fel med "Kan inte hitta namn..."

Svar #2

Tydligen fungerade det att använda ett annat namn vid import:

fil1

export namespace nspace {
    export class ClassA {

    }
}

fil2

import * as a from './file1';

export namespace nspace {
    export class ClassB extends a.nspace.ClassA {
        private  b: a.nspace.ClassA;

    }
}