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
- È questo in base alla progettazione che uno di questi lavori ch e l'altro no?
- 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?
Grazie, esattamente le informazioni di cui avevo bisogno. – bingles
E verrà risolto in TS 2.0: https://github.com/Microsoft/TypeScript/issues/3812 – Alex