MB: Namenskollision

moin,

ich hab n kleines Problem bezüglich Namenscollidierung. Ich will das mit Modulen realisieren.

export module {

  export module Core {
    export class Model {}
    export class View {}
    export class Controller {}
  }

  export module Model {
    export class Foo {}
    export class Bar {}
  }

  export module View {
    export class Foo {}
    export class Bar {}
  }

  export module Controller {
    export class Foo {}
    export class Bar {}
  }
}

Klapppt supi aber ich krigs nicht hin das alles zu seperieren. Hab versuch sowas zu machen

Controller Core

export default class Controller {}

Foo Controller

import Controller from 'controller.core';
export default class Foo extends Controller {}

export.controller.ts Auszug

import Foo from './foo.controller';
import Bar from './bar.controller';
export { Foo, Bar }

imports.ts Beispiel

import Controller from './export.controller';
import View from './export.view';
import Model from './export.model';

// Klappt nicht :/
let cFoo = new Controller.Foo()
let mFoo = new View.Foo()
let vFoo = new Model.Foo()

auserdem müssen die ja aufeinander intern zugreifen. Mit namespace braucht man bekanntlicherweise referenzen. Ich benötige das für n Projekt :/.

vlg MB

  1. ich hab n kleines Problem bezüglich Namenscollidierung.

    Tja, Import ist eben nicht die Lösung. Nette Erfahrung ;)

    Lösung: Baue eine Klassenhierarchie, dann sind die Konflikte weg

      Core
        Core::Model
          Core::Model::Foo
          Core::Model::Bar
        Core::View
          Core::View::Foo
          Core::View::Bar
        Core::Controller
          Core::Controller::View
          Core::Controller::Bar
    

    auserdem müssen die ja aufeinander intern zugreifen.

    Eine Möglichkeit ist über Vererbung gegeben, Erbfolge siehe oben. Die andere Möglichkeit besteht darin, Methoden zu delegieren, zB:

    Eine Instanz der Klasse Core::View::Foo bekommt eine Instanz der Klasse Core::Controller::View als Eigenschaft und kann somit Methoden der Klasse Core::Controller::View ausführen.

    MfG

    1. Tach!

      Lösung: Baue eine Klassenhierarchie, dann sind die Konflikte weg

      Nein, das löst das Problem mitnichten. Es bleibt genauso bestehen, wenn man nicht auch noch komplett auf Module und den Autoload-Mechanismus verzichtet und stattdessen wieder zu Fuß die verwendeten Dateien über <script> einbindet.

      dedlfix.

  2. Tach!

    imports.ts Beispiel

    import Controller from './export.controller';
    import View from './export.view';
    import Model from './export.model';
    
    // Klappt nicht :/
    let cFoo = new Controller.Foo()
    let mFoo = new View.Foo()
    let vFoo = new Model.Foo()
    

    "Klappt nicht" ist keine Fehlerbeschreibung. Es gibt eine konkrete Fehlermeldung, wenn du das so schreibst. Und die lautet für Zeile 1, dass dein Modul export.controller keine Default-Exports enthält. Und diesen nicht vorhandenen Default-Export kannst du nicht unter dem Namen Controller importieren. Dein export.controller exportiert nur Foo und Bar, und genau diese beiden kannst du von dem Modul importieren.

    import {Foo, Bar} from './export.controller';
    

    Da du nun diese beiden Namen in deinem aktuellen Scope hast, kannst du sie direkt verwenden.

    let cFoo = new Foo()
    

    dedlfix.