2014-05-01 10 views
10

Mein Schreibmaschinen-Level ist 'ABSOLUTE BEGINNER', aber ich habe einen guten OOP-Hintergrund. Ich baue ein mit Typoskript, die eine externe t.ds Bibliothek verweisen, die die folgende Schnittstelle enthält:typescript interface initialization

interface ISimpleObject { 
    foo: string; 
    bar?: any; 
} 

Nun, wenn ich eine Methode aufrufen wollen, die einen IRequestConfig Parameter hat, wie kann ich erstellen? Ich kann verschiedene Optionen sehen:

  1. Erstellen Sie eine einfache Implementierung von ISimpleObject. Ich mag diesen Ansatz nicht, weil es wie Textvorschlag Code sieht für mich
  2. nicht initialisieren das Objekt (Ich fürchte, das ist etwas brechen könnte ...):

    var x :IsimpleObject; x.bar = 'xxx'; callMethod(x);

  3. ein pojo Cast :

    var x :IsimpleObject = <IsimpleObject>{foo: 'yyy', bar:'xxx'};

    ich entweder diesen Ansatz nicht mögen, weil es nicht die Typsicherheit erzwingt ...

Ich denke, das ist eine ziemlich triviale Frage und mir fehlt etwas triviales über Typoskript.

Antwort

21

Wenn Sie eine Schnittstelle wie:

interface ISimpleObject { 
    foo: string; 
    bar?: any; 
} 

Diese Schnittstelle nur bei der Kompilierung und für Code-Hinting/intellisense verwendet wird. Schnittstellen werden verwendet, um eine strenge und typensichere Methode zur konsistenten Verwendung eines Objekts mit einer definierten Signatur bereitzustellen.

Wenn Sie eine Funktion mit der interface oben definiert:

function start(config: ISimpleObject):void { 

} 

Typoskript Kompilierung schlägt fehl, wenn ein Objekt nicht die genaue Signatur der ISimpleObject Schnittstelle verfügt.

Es gibt mehr gültigen Techniken für den Aufruf die Funktion start:

// matches the interface as there is a foo property 
start({foo: 'hello'}); 

// Type assertion -- intellisense will "know" that this is an ISimpleObject 
// but it's not necessary as shown above to assert the type 
var x = <ISimpleObject> { foo: 'hello' }; 
start(x); 

// the type was inferred by declaration of variable type 
var x : ISimpleObject = { foo: 'hello' }; 
start(x); 

// the signature matches ... intellisense won't treat the variable x 
// as anything but an object with a property of foo. 
var x = { foo: 'hello' }; 
start(x);  

// and a class option: 
class Simple implements ISimpleObject { 
    constructor (public foo: string, public bar?: any) { 
     // automatically creates properties for foo and bar 
    } 
} 
start(new Simple("hello")); 

Jedes Mal, wenn die Signatur nicht übereinstimmt, wird die Kompilierung fehlschlagen:

// compile fail 
var bad = { foobar: 'bad' }; 
start(bad); 

// compile fail 
var bad: ISimpleObject = { foobar: 'bad' }; 

// and so on. 

Es gibt keinen „richtigen“ Weg es zu tun. Es ist eine Frage der Stilwahl.Wenn es ein Objekt ist, das konstruiert wurde (und nicht nur direkt als Parameter übergeben), würde ich normalerweise die Art erklären:

var config: ISimpleObject = { foo: 'hello' }; 

Auf diese Weise Code-Completion/IntelliSense überall arbeitet ich die config Variable verwendet:

config.bar = { extra: '2014' }; 

In TypeScript gibt es kein "Casting". Es wird eine Typ-Assertion genannt und sollte in den hier beschriebenen Fällen nicht benötigt werden (ich habe oben ein Beispiel eingefügt, wo es verwendet werden könnte). Sie müssen die Variable Type nicht deklarieren und dann in diesem Fall eine Assertion verwenden (da der Typ bereits bekannt war).

+0

Ich wünschte, ich hätte mehr Upvotes! – mentat

1
  • Sie können keine Instanz einer Schnittstelle erstellen, da Typescript sie nicht in js "übersetzt". Sie können die js überprüfen, die erstellt wird, und Sie werden nichts darin sehen. Es ist einfach für Kompilierungsfehler, geben Sie Sicherheit und Intelistense ein.

    interface IStackOverFlow 
    { 
        prop1 : string; 
        prop2 : number; 
    } 
    
    public MyFunc(obj : IStackOverFlow) 
    { 
        // do stuff 
    } 
    
    var obj = {prop1: 'str', prop2: 3}; 
    MyFunc(obj); // ok 
    
    var obj2 = {prop1: 'str'}; 
    MyFunc(obj); // error, you are missing prop2 
    
    // getObj returns a "any" type but you can cast it to IStackOverFlow. 
    // This is just an example. 
    var obj = <IStackOverFlow> getObj(); 
    
+0

so der richtige Ansatz ist der erste? –

+1

hängt davon ab, was Sie tun müssen. Da Sie eine Schnittstelle nicht "neu" erstellen können, können Sie nur Pocos wirken und den Typskript-Compiler beobachten lassen, dass Sie Sachen richtig machen. –

+0

Das Problem mit Pojos ist, dass der Compiler mir nicht sagt, ob die Parameter korrekt sind, also ob ich schreibe 'fooo' anstatt' foo' ich erhalte keine warnung. Hab ich recht? –

10

Typescript2:

const simpleObject = {} as ISimpleObject; 
Verwandte Themen