2016-09-02 2 views
-2

Ich versuche herauszufinden, wie eine einzelne Instanz einer Schnittstelle in Typescript erhalten. Ich habe den folgenden Code, das funktioniert:Wie erhalte ich eine einzelne Instanz einer Schnittstelle in Typescript

export interface IOpenStatus { 
    filePath: string; 
    openSuccess: boolean; 
    error: string; 
    fileData: string; 
} 

openStatus: IOpenStatus[]; 

Allerdings, wenn ich nur eine einzige Instanz der Schnittstelle soll definiert werden, diese nicht:

openStatus: IOpenStatus; 

Dies scheitert auch:

Es scheint, dass das Array "[]" irgendwie einen Mechanismus zur Instanzerstellung ersetzt (wenn auch für mehrere Instanzen). In meiner Situation möchte ich nie mehr als eine Instanz der Schnittstelle instanziieren.

Wie instanziiere ich eine einzelne Instanz der Schnittstelle? Ich muss eine Schnittstelle verwenden, weil ich diese Daten vom Server mit derselben Schnittstelle zurückgeben werde.

UPDATE Ich kann einen Teil des Problems sehen, ich habe den Kontext nicht angegeben. Ich mache das in einer Angular2-Anwendung. In meiner Situation, war ich mit

openStatus: IOpenStatus[];

als Teil einer Klasse Eigenschaftsdefinition (eine Komponente um genau zu sein). Es scheint, dass die Array-Notation einfach erlaubt, dass Javascript die Instanziierung eines Arrays vom Typ der Schnittstelle ohne irgendeine weitere Definition vorwegnimmt (es kann unmittelbar danach als ein Array von solchen verwendet werden).

Was ich zu tun habe, am Ende zu verwenden:

userOpenStatus = new OpenStatus();

ist die Schnittstelle in einer Klasse zu implementieren, wie:

export interface IOpenStatus { 
    filePath: string; 
    openSuccess: boolean; 
    error: string; 
    fileData: string; 
} 

export class OpenStatus implements IOpenStatus { 
    filePath: string; 
    openSuccess: boolean; 
    error: string; 
    fileData: string; 
} 
+0

Sie können eine Schnittstelle nicht instanziieren. Sie existieren, um einen Vertrag ohne Implementierung zu haben, also ist das Instanziieren gegen den gesamten Grund, warum sie existieren. – ssube

+0

ok, also wenn das stimmt, wie kommt es, dass 'openStatus: IOpenStatus [];' ** ** implementiert ein Array der Schnittstelle? –

+0

'IOpenStatus []' deklariert einfach 'openStatus', um eventuell ein Array von' IOpenStatus' zu enthalten, es implementiert oder instanziert nichts. – ssube

Antwort

2

Gegeben:

export interface IOpenStatus { 
    filePath: string; 
    openSuccess: boolean; 
    error: string; 
    fileData: string; 
} 

Dies ist ein Syntaxfehler:

openStatus: IOpenStatus[]; 

(Obwohl es als Klasseneigenschaft Erklärung gültig sein würde.) Sie könnten so etwas wie benötigen:

let openStatus: IOpenStatus[]; 

Dies entspricht genau der Ebene JS Version:

let openStatus; 

Die einzige Unterschied ist die Art Annotation. Wenn Sie nicht wollen, es eine Reihe von Ihrer Art sein, sagen Sie einfach:

let openStatus: IOpenStatus; 

Um nach dem new Schlüsselwort angezeigt werden soll, eine Kennung der Name einer Konstruktorfunktion sein muss, und der einfachste Weg, Erklären Sie eine davon mit dem Schlüsselwort class.Aber man konnte nur eine Art wörtlichen verwenden:

openStatus = { 
    filePath: "/blah", 
    openSuccess: true, 
    error: "", 
    fileData: "Hello, world." 
}; 

, dass die Eigenschaften alle für IOpenStatus erforderlich ist, so kann es zu einer Variable dieses Typs zugewiesen werden.

Verwandte Themen