2015-03-03 12 views
5

Ich verwende AMD-Module (Compiler-Flag "--module amd") in meinem TypScript-Projekt. Ich kann zwar easily use getters/setters on my classes Ich möchte das gleiche auf meine Module tun, aberGetter/Setter auf einem Modul in TypeScript

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

kehrt

Fehler TS1008: unerwartetes Token; 'Modul, Klasse, Schnittstelle, enum, Import oder Anweisung' erwartet.

und

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

kehrt

Fehler TS1005:. '(' Erwartet

Was mache ich falsch

+1

möglich Duplikat [Eigenschaften in einem Modul] (http://stackoverflow.com/questions/20925921/properties-in-a-module) – Acidic

Antwort

7

Sie können nur Getter hinzu? und Setzer zu einer Klasse im Moment .

Die Codetransformation, die TypeScript für Getter und Setter verwendet, fügt die Eigenschaft dem Prototyp des Objekts hinzu, was für Klassen mehr Sinn macht als für Module.

+1

sind die Module nicht von Natur aus auch Objekte? Ich dachte, Getter/Setter wird für jedes Objekt verfügbar sein. –

+0

@ daniel.sedlacek nicht, wenn das Objekt einen undefinierten Prototyp hat –

+0

@ daniel.sedlacek Klassen-Getter/Setter sind für die Instanz der Klasse verfügbar, nicht für das Klassenobjekt (d. H. Die Funktion) selbst.Sie können wahrscheinlich statische Getter/Setter für eine Klasse verwenden und dann die Definition mit einem Modul zusammenführen. Der Typ des Moduls wird jedoch funktionieren. –

4

Dies ist möglich, die spezielle export = ... Syntax wie folgt:

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

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

Dies macht eine Instanz der Klasse MyModule wirken als die API des Moduls. Sie müssen keine Daten in die Klasse einfügen - verschieben Sie einfach Ihre Funktionen hinein und lassen Sie sie ansonsten unverändert. Der Nachteil ist, dass, wenn die Funktion a die Funktion b aufruft, sie this.b() oder myModule.b() sagen muss (letztere ist näher an einem normalen Modul-Export).

Auch Sie müssen zuerst eine benannte Variable deklarieren. Man kann nicht einfach sagen:

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

Gerade als Referenz für zukünftige Besucher ...

Ähnlich wie @ Daniel Earwicker sagte, und zu erklären, was @ billc.cn sagen wurde, können Sie auch ein conflate Klasse mit einem Namespace und dann nur die Getter/Setter als statische Methode definieren:

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

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

Aber das bedeutet, dass Sie einen Namespace in Ihrer Bibliothek (Modul) haben wird, und wenn Sie die Art und Weise ändern möchten, die Sie ansprechen Attribute Ihrer Bibliothek, müssen Sie den Hacktundass @Daniel Earwicker erwähnt.

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

Verwandte Themen