2015-11-02 21 views
6

Ich verwende einen Wächter TypScript in einem ternären Operator innerhalb einer Schleife und sehe ein Verhalten, das ich nicht verstehe.TypeScript Typ Wächter Oddity

Meine Schnittstellen

interface INamed { 
    name: string; 
} 

interface IOtherNamed extends INamed { 
    otherName: string; 
} 

Mein Typ-Schutz

function isOther(obj: any): obj is IOtherNamed { 
    ... // some check that returns boolean 
} 

Allgemeine Anwendungsbeispiel

var list: Array<{named: INamed}> = []; 

for(let item of list) { 
    var other: IOtherNamed = ... 
} 

Innerhalb meiner for .. of Schleife benutze ich meinen Typwächter, um entweder einer Variablen von IOtherNamed mein aktuelles Objekt oder null zuzuweisen. Meine Fragen

    funktioniert das nicht

    // Compiler Error: INamed is not assignable to IOtherNamed 
    for(let item of list) { 
        var other: IOtherNamed = isOther(item.named) ? item.named : null; 
    } 
    

    Diese

    for(let item of list) { 
        var named: INamed = item.named; 
        var other2: IOtherNamed = isOther(named) ? named : null; 
    } 
    

    tut

  1. Ist das durch Design, das eines dieser Werke wh Ile der andere nicht?
  2. Wenn von Entwurf, was ist die Nuance hier bestimmt, wenn es funktioniert oder nicht? Warum wird der Compiler-Fehler durch das Zuweisen des Objekts an eine neue Variable (ohne Änderung des Typs) beseitigt?

Antwort

4

Ja, das ist von Entwurf für Typoskript < 2.0:

Beachten Sie, dass Typ Wachen Typen von Variablen und Parameter wirken sich nur auf und haben keinen Einfluss auf die Mitglieder von Objekten wie Eigenschaften.

-4,20 von der Sprachspezifikation (PDF, Seite 83)

So ist der Grund, warum es in der zweiten Szenario funktioniert, weil Sie die Eigenschaft einer Variablen zugewiesen haben, und dann diese Variable bewacht Typ.

Aktualisierung: Wie Alex darauf hingewiesen hat, unterstützt TypeScript 2.0 die Typüberwachung von Eigenschaften.

+0

Danke, genau die Informationen, die ich brauchte. – bingles

+0

Und wird in TS 2.0 behoben: https://github.com/Microsoft/TypeScript/issues/3812 – Alex

Verwandte Themen