2013-08-13 20 views
6

Ho scritto una piccola funzione per una migliore gestione dei tipi.Ottieni il tipo di parametro generico

function evaluate(variable: any, type: string): any { 
    switch (type) 
    { 
     case 'string': return String(variable); 
     case 'number': return isNumber(variable) ? Number(variable) : -1; 
     case 'boolean': { 
      if (typeof variable === 'boolean') 
       return variable; 

      if (typeof variable === 'string') 
       return (<string>variable).toLowerCase() === 'true'; 

      if (typeof variable === 'number') 
       return variable !== 0; 

      return false; 
     } 
     default: return null; 
    } 
} 

function isNumber(n: any): boolean { 
    return !isNaN(parseFloat(n)) && isFinite(n); 
} 

Provo lo stesso con i generici, ma non so come ottenere il tipo da parametro generico. È possibile?

+0

Non è così. La digitazione di TypeScript è solo una funzione in fase di compilazione. L'output JavaScript non ha informazioni sul tipo e non ha strutture per la riflessione. Devi fare affidamento sul buon vecchio '' typeof'' nel tuo codice come in JavaScript. –

+0

Per il record è possibile comprimere il gestore per bool in 'return !! variable;' –

risposta

9

typeof è un operatore JavaScript. Può essere utilizzato in fase di esecuzione per ottenere i tipi di JavaScript conosciuti. I generici sono un concetto di TypeScript che aiuta a verificare la correttezza del codice ma non esiste nell'output compilato. Quindi la risposta breve è no, non è possibile.

Ma si potrebbe fare qualcosa di simile:

class Holder<T> { 
    value: T; 
    constructor(value: T) { 
     this.value = value; 
    } 
    typeof(): string { 
     return typeof this.value;  
    } 
} 

Try it out.

Questo funziona perché sto operando sul valore all'interno del titolare, non sul titolare stesso.

+5

È ancora vero nel 2017 che non è possibile ottenere il nome del tipo passato in generici, ad eccezione di questo? – veljkoz

+1

restituisce this.value.constructor ['name']; // <- sembra funzionare nel campo giochi dattiloscritto. Tratto da [qui] (http://stackoverflow.com/questions/13613524/get-an-objects-class-name-at-runtime-in-typescript). Potrebbero esserci problemi con la minificazione ecc. –

+0

In teoria si può anche fare: function create (c: {new(): T;}): T { return new c(); } non riesco a farlo funzionare da https://www.typescriptlang.org/docs/handbook/generics.html – titusfx

Problemi correlati