2012-10-14 24 views
22

Powiedz, że chcę mieć plik jednej klasy na .ts. Mam dwa pliki .TS, które wyglądają tak:Jak umieścić wiele zewnętrznych modułów w tej samej przestrzeni nazw w TypeScript?

export module MyClasses { export class A {} } 

i

export module MyClasses { export class B {} } 

Nie mogę tego zrobić:

import MyClasses = module('A'); 
import MyClasses = module('B'); 

jaki sposób definiowania klas w osobnych plikach i umieścić je w tej samej "przestrzeni nazw"? Ponadto, możemy skończyć się zrobić coś takiego:

MyClasses.MyClasses.A 

zamiast

MyClasses.A 

jaki jest sens tego dodatkowego poziomu hierarchii? Aby mieć więcej niż jeden wyeksportowany moduł w pliku modułu? Najlepszym rozwiązaniem, jakie do tej pory odkryłem, jest usunięcie "modułu eksportu" (ponieważ "klasa eksportowa" wydaje się wystarczająca przy kompilacji AMD), która przenosi klasę o jeden poziom hierarchiczny. Następnie:

import AModule = module('A'); 
module MyClasses{ var A = AModule.A; } 
import BModule = module('B'); 
module MyClasses { var B = BModule.B; } 

Chociaż działa idealnie, nie jest dokładnie zwięzły. Czy nie ma lepszego sposobu na zrobienie tego?

+1

Złożyłem żądanie funkcji dla słowa kluczowego, które robi coś takiego: http://typescript.codeplex.com/workitem/305 – Brent

Odpowiedz

1

Przepraszam za złe nazwy zmiennych, testowałem to w Visual Studio. To zadziałało dla mnie, gdy używano różnych nazw dla instrukcji importu.

import x = module('A'); 
import y = module('B'); 

x.MyClasses.A; 
y.MyClasses.B; 

Alternatywnie, można użyć komentarze odniesienia do podobnego efektu, ale jest lepiej, jeśli łączenie, jeśli nie używasz modułu załadunku. trzeba by upuścić słowa kluczowego export ze swoimi dwoma MyClasses deklaracji:

///<reference path='A.ts'/> 
///<reference path='B.ts'/> 

var x = MyClasses.A; 
3

Nie sądzę, nie ma lepszego sposobu, aby to osiągnąć z zewnętrznych modułów. Specyfikacja języka definiuje moduły zewnętrzne w następujący sposób:

Moduły zewnętrzne (punkt 9.4) to oddzielnie ładowane elementy kodu, do których odwołuje się nazwa modułu zewnętrznego. Moduł zewnętrzny jest zapisywany jako osobny plik źródłowy zawierający co najmniej jedną deklarację importu lub eksportu.

Dalej mówi, że wewnętrzne moduły są otwarte zakończył i może rozciągać się na wiele plików:

moduły wewnętrzne są „otwartym” i wewnętrzne deklaracje moduł z tej samej nazwy kwalifikowanej w stosunku do wspólny katalog główny (zgodnie z definicją w sekcji 2.2) przyczynia się do stworzenia jednego modułu.

Nie znalazłem innej wzmianki o podobnym stwierdzeniu dla modułów zewnętrznych. Jestem prawie przekonany, że tak nie jest. Jeśli potrzebujesz ładowania modułów, będziesz musiał żyć ze ścieżkami referencyjnymi, aby uzyskać dostęp do typów ładowanych z różnych plików.

Jednak dla mnie wygląda na to, że lepiej wybrać moduły wewnętrzne.Następnie można po prostu rozłożone moduł ciągu dwóch plików

export module MyClasses { export class A {} } 

i

export module MyClasses { export class B {} } 

dostosowania ich do zakresu ze ścieżkami odniesienia

///<reference path='A.ts'/> 
///<reference path='B.ts'/> 

a następnie po prostu odwoływać się do nich z nazwą modułu, takie jak na przykład

var a = new MyClasses.A(); 
+6

Podczas gdy komentarz "referencyjny" może sprawić, że twój ulubiony TypeScript IDE jest szczęśliwy, nie załaduje twojego modułu w czasie pracy. –

8

Niestety nie wydaje się być idealnym rozwiązaniem, ale jest to w jaki sposób rozwiązać go teraz:

plik 'controllers/MainController.ts':

class MainController { 
    ... 
} 

export = MainController; 

pliku „Kontrolery /SecondController.ts':

class SecondController { 
    ... 
} 

export = SecondController; 

pliku 'Kontrolery/Namespace.ts':

import MainController = require('./MainController'); 
import SecondController = require('./SecondController'); 

export = { MainController, SecondController } 

Plik „App.ts” (gdzie stosuje się „namespace”)

import Controllers = require('Controllers/Namespace'); 

angular.module('app', []) 
    .controller('MainController', Controllers.MainController) 
    .controller('SecondController', Controllers.SecondController) 

To daje piękny intellisense, ukrywa 400 instrukcje importu z dala i utrzymuje kod gdzie nazw jest rzeczywiście używane całkiem czyste ...

+0

Może być konieczne użycie formularza: ' eksport * z" ./MainController "; eksport * z "./SecondController"; ' w Namespace.ts – pennyowe

Powiązane problemy