Namenskollision
MB
- typescript
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
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
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.
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.