2013-08-13 4 views
6

Я написал небольшую функцию для лучшей обработки с помощью типов.Получить тип общего параметра

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

Я пробую то же самое с дженериками, но не знаю, как получить тип из общего параметра. Возможно?

+0

Это не так. Напечатка TypeScript - это только функция времени компиляции. Выходной JavaScript не имеет информации о типе и не имеет возможностей для отражения. Вы должны полагаться на старый добрый '' typeof'' в своем коде, как в JavaScript. –

+0

Для записи вы можете свернуть ваш обработчик для bools, чтобы 'return !! variable;' –

ответ

9

typeof является оператором JavaScript. Его можно использовать во время выполнения, чтобы узнать, о чем знает JavaScript. Generics - это концепция TypeScript, которая помогает проверить правильность вашего кода, но не существует в скомпилированном виде. Итак, короткий ответ - нет, это невозможно.

Но вы могли бы сделать что-то вроде этого:

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

Try it out.

Это работает, потому что я использую значение внутри держателя, а не самого держателя.

+5

В 2017 году все еще верно, что мы не можем получить имя типа, переданного в generics, за исключением этого? – veljkoz

+1

return this.value.constructor ['name']; // <- похоже, работает на машинописной площадке. Взято из [здесь] (http://stackoverflow.com/questions/13613524/get-an-objects-class-name-at-runtime-in-typescript). Могут быть проблемы с минимизацией и т. Д. –

+0

В теории вы также можете: function create (c: {new(): T;}): T { return new c(); } Я не могу заставить его работать от https://www.typescriptlang.org/docs/handbook/generics.html – titusfx

Смежные вопросы