2015-03-03 11 views
5

Używam modułów AMD (flaga kompilatora "--module amd") w moim projekcie TypeScript. Chociaż mogę easily use getters/setters on my classes chciałbym zrobić to samo na moim modułów aleProgram pobierający/ustawiający na module w TypeScript

export get abc() : string { 
    return "abc"; 
} 

powraca

błąd TS1008: Nieoczekiwany token; "moduł, klasa, interfejs, enum, import lub instrukcja" oczekuje.

i

export function get abc() : string { 
    return "abc"; 
} 

powraca

błąd TS1005. '(' Oczekiwane

Co robię źle

+1

możliwe duplikat [właściwości w module] (http://stackoverflow.com/questions/20925921/properties-in-a-module) – Acidic

Odpowiedz

7

Można dodać tylko pobierające? i seterów do klasy w tej chwili .

Transformacja kodu TypeScript używa na obiektach pobierających, a setery dodają właściwość do prototypu obiektu, co ma więcej sensu dla klas niż dla modułów.

+1

nie są moduły natury Przedmioty też? Myślałem, że getter/setter będzie dostępny na każdym obiekcie. –

+0

@ daniel.sedlacek nie, gdy obiekt ma niezdefiniowany prototyp –

+0

@ daniel.sedlacek Klasa getter/setters są dostępne na wystąpienie klasy, a nie obiekt klasy (tj. Sama funkcja).Prawdopodobnie możesz użyć statycznych modułów pobierających/ustawiających na klasie, a następnie połączyć definicję z modułem. Typ modułu będzie jednak działać. –

4

Jest to możliwe za pomocą specjalnej składni export = ... następująco:

class MyModule { 
    get abc() { 
     return "abc"; 
    } 
} 

var myModule = new MyModule(); 
export = myModule; 

To sprawia, że ​​wystąpienie aktu klasa MyModule jako API modułu. Nie musisz umieszczać żadnych danych w klasie - po prostu przenieś swoje funkcje do niego i pozostaw bez zmian. Wadą jest to, że funkcja a dzwoni do funkcji lub (ta ostatnia jest bliżej normalnego eksportu modułu).

Należy również najpierw zadeklarować zmienną nazwaną. Nie można po prostu powiedzieć:

export = new MyModule(); // This doesn't work 
0

Tylko dla odniesienia przyszłych gości ...

podobne do tego, co @Daniel Earwicker mówił i wyjaśniając co @ billc.cn mówił, można również scalenia klasy z przestrzeni nazw, a następnie po prostu zdefiniować getter/setter jako metody statycznej:

export class X { 
    static get abc():string { 
     return "abc"; 
    } 
} 

export namespace X { 
    // ... other code 
} 

Ale to oznacza, że ​​trzeba będzie nazw w bibliotece (moduł) i jeśli chcesz zmienić sposób, że zajęcia atrybuty twojej biblioteki, będziesz musiał zrobić hackowanie export = X;, o której wspomniał @Daniel Earwicker.

https://www.typescriptlang.org/docs/handbook/declaration-merging.html