2016-03-01 13 views
7

qual è il modo corretto di gestire una situazione in cui si dispone di due interfacce che sono abbastanza simili che si desidera eseguire loro attraverso lo stesso pezzo di logica:Tipi tipografico Union: Trattare con interfacce

interface DescriptionItem { 
    Description: string; 
    Code: string; 
} 
interface NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    var desc = (<DescriptionItem>i).Description || (<NamedItem>i).Name; 

    return i.Code + ' - ' + desc; 
} 

Questo funziona; tuttavia, la mia domanda è sul miglioramento della linea var desc = .... È quello che ho sopra l'opzione migliore? O c'è un modo migliore per gestire questa situazione in Typescript?

+0

Direi che il modo in cui l'avete fatto tutto sembra a posto. Tuttavia la domanda in sé è principalmente basata sull'opinione e voterò per chiuderla su questa base. :) – toskv

risposta

5

TypeScript interfaces esistono solo in fase di compilazione, quindi non c'è molto che si possa fare per testare i tipi di interfaccia in fase di esecuzione. Il codice che hai specificato nella tua domanda ha senso ed è probabilmente la tua migliore opzione.

Tuttavia, se avete la possibilità di cambiare la vostra interfaces-classes, è possibile utilizzare le guardie di tipo tipografico di fare più elegante controllo dei tipi:

class DescriptionItem { 
    Description: string; 
    Code: string; 
} 
class NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    let desc: string; 
    if (i instanceof DescriptionItem) { 
     desc = i.Description; 
    } else { 
     desc = i.Name; 
    } 

    return i.Code + ' - ' + desc; 
} 
+0

Perché non è possibile verificare se 'i.Name' esiste e differenziare i tipi in base a ciò? – jocull

+0

@jocull Cosa succede se l'oggetto era un'istanza di 'NamedItem', ma il suo' Nome' era 'indefinito'? –

+0

Se mancano dati non opzionali, è davvero un'istanza di 'NamedItem' allora? – jocull