2013-08-13 14 views
6

Napisałem małą funkcję, aby lepiej obsługiwać typy.Uzyskaj typowy parametr ogólny

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); 
} 

Próbuję to samo z rodzajami, ale nie wiem, jak uzyskać typ od ogólnego parametru. To jest możliwe?

+0

Nie, nie jest. Pisanie TypeScript to tylko funkcja kompilacji. Wyjściowy JavaScript nie ma informacji o typie i nie ma możliwości odzwierciedlenia. Musisz polegać na dobrym starym '' typeof'' w kodzie jak w JavaScript. –

+0

Dla rekordu możesz zwinąć swój program obsługi dla zmiennych do 'return !! variable;' –

Odpowiedz

9

typeof to operator JavaScript. Można go używać w czasie wykonywania, aby uzyskać informacje o typach skryptów JavaScript. Generics to koncepcja TypeScript, która pomaga sprawdzić poprawność kodu, ale nie istnieje w skompilowanym wyjściu. Krótka odpowiedź brzmi: nie, to niemożliwe.

Ale można zrobić coś takiego:

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

Try it out.

Działa to, ponieważ operuję na wartości wewnątrz posiadacza, a nie na samym posiadaczu.

+5

Czy to prawda, że ​​w 2017 roku nie możemy uzyskać nazwy typu przekazywanego w ogóle, z wyjątkiem tego? – veljkoz

+1

return this.value.constructor ['name']; // <- wydaje się działać na placu zabaw maszynopisu. Zaczerpnięte z [tutaj] (http://stackoverflow.com/questions/13613524/get-an-objects-class-name-at-runtime-in-typescript). Możliwe problemy z minimalizacją itp. –

+0

Teoretycznie możesz również: funkcja create (c: {new(): T;}): T { return new c(); } nie mogę pracować z https://www.typescriptlang.org/docs/handbook/generics.html – titusfx

Powiązane problemy