2015-11-02 22 views
6

Sto utilizzando una protezione di tipo TypeScript in un operatore ternario all'interno di un ciclo e vedo un comportamento che non capisco.Protezione tipo TypeScript Oddity

mie interfacce

interface INamed { 
    name: string; 
} 

interface IOtherNamed extends INamed { 
    otherName: string; 
} 

mio tipo di guardia

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

Esempio Uso generale

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

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

All'interno del mio ciclo for .. sto usando il mio tipo guardia per assegnare il mio elemento corrente o null ad una variabile di IOtherNamed.

Questo non funziona

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

Questo fa

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

Le mie domande

  1. È questo in base alla progettazione che uno di questi lavori ch e l'altro no?
  2. Se per progettazione, qual è la sfumatura qui che determina quando funziona o no? In particolare, perché assegnando il mio oggetto a una nuova variabile (senza alcun cambio di tipo) si elimina l'errore del compilatore?

risposta

4

Sì, questo è di progettazione per il dattiloscritto < 2.0:

notare che le guardie di tipo influenzare i tipi di variabili e parametri solo e non hanno effetto sui membri di oggetti come le proprietà.

-4,20 dalla specifica del linguaggio (PDF, pag 83)

Così il motivo per cui funziona nel secondo scenario è perché è stata assegnata la proprietà a una variabile e quindi digitare custodito quella variabile.

Aggiornamento: Come ha sottolineato Alex, TypeScript 2.0 supporterà protezioni di tipi sulle proprietà.

+0

Grazie, esattamente le informazioni di cui avevo bisogno. – bingles

+0

E verrà risolto in TS 2.0: https://github.com/Microsoft/TypeScript/issues/3812 – Alex

Problemi correlati