2016-04-07 13 views
6

Quindi, sto giocando con l'inferenza di tipo in TypeScript. Fornirò due esempi che producono gli stessi risultati quando invocato, tuttavia in uno di essi TypeScript non può inferire il tipo a causa di "Nessun miglior tipo comune".Tipo di inferenza con tipi di unione - Non esiste il miglior tipo comune

Esempio con operatore ternario

function foo(a: boolean) { 
    return a ? 4 : true; 
} 

Il compilatore deduce che foo è (a: boolean) => number | boolean che è eccezionale.

Esempio con if

function foo(a: boolean) { 
    if (a) { 
     return 4; 
    } else { 
     return true; 
    } 
} 

Il compilatore si lamenta "No miglior tipo comune" quando si cerca di dedurre il tipo di ritorno. Mi confonde che se le affermazioni dovessero interferire con l'inferenza del tipo. Come mai?

risposta

1

Questo errore verrà generato quando le istruzioni di reso in una funzione non hanno un tipo comune. Questo può accadere solo quando esistono dichiarazioni di reso multiple.

Primo esempio - Un ritorno dichiarazione

Nel primo esempio c'è un solo istruzione return che restituisce un valore digitato come number | boolean (parentesi aggiunte per enfatizzare questa è un'espressione):

return (a ? 4 : true); // return number | boolean 

Va bene. Non ci sono altre dichiarazioni di ritorno con cui il tipo deve essere in comune.

Secondo esempio - più istruzioni return

Il secondo esempio ha più istruzioni return ...

if (a) { 
    return 4; // return number 
} else { 
    return true; // return boolean 
} 

... e nessun tipo comune esiste tra i più istruzioni. Quindi errori.

Soluzione con più istruzioni return

Quando non esiste un tipo comune tra le dichiarazioni di ritorno, è necessario essere espliciti, al fine di lasciare che il compilatore che si intendono fare questo:

function foo(a: boolean): number | boolean { 
    if (a) { 
     return 4; 
    } else { 
     return true; 
    } 
} 

Relativo: Vedi "Best Common Type"

+0

Sì, so che l'annotazione di tipo aiuta qui. Quindi, qual è la logica dietro da una prospettiva di compilatore? – Peter

+1

@Peter Non riesco a trovare da nessuna parte l'origine di questo, ma sono abbastanza sicuro che lo fa al fine di aiutare a prevenire gli errori. Di solito vuoi restituire un tipo comune da tutte le dichiarazioni di ritorno ... se non lo sei, il codice può diventare confuso. –