Как получить тип T внутри обобщенного метода в Typescript? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть универсальный метод в классе.,

export class BaseService {
    public getAll<T>(): Observable<T> {
        // get type of T

        // const type = typeof(T); // Tried this but getting compilation exceptions 

        return this.http.get<T>(this.actionUrl + 'getAll');
    }
}

Я буду вызывать метод, как показано ниже, из нескольких других классов машинописи.

this.service.getAll<SubscriberData>().subscribe(response => {
      // Response
    }, error => {
      console.log(error);
    }, () => {
      // do something commonly
    });

Когда я попробовалполучая следующее исключение

const type = typeof(T); 

'T' относится только к типу, но здесь используется в качестве значения.

Редактировать:

Я пытаюсь получить тип класса, который вызывает универсальный метод.Например: getAll<SubscriberData> я хочу получить тип SubscriberData внутри этого метода.

Как я могу это сделать?

1 Ответ

0 голосов
/ 27 мая 2018

Вы можете получить доступ к ссылке на конструктор класса в декораторе класса, свойстве в декораторе свойства (или средства доступа) или параметру в декораторе параметров (используя refle-metadata ).

К сожалению, аргументы универсального типа недоступны во время выполнения таким образом, они всегда будут давать эквивалент времени выполнения простого типа Object.

Вместо этого вы можете предоставить ссылку на конструктор, которую вытакже можно использовать для вывода универсального типа (т. е. вместо указания универсального типа, вы указываете соответствующую ссылку на конструктор этого универсального типа):

export class BaseService {
    public getAll<T>(TCtor: new (...args: any[]) => T): Observable<T> {
        // get type of T
        const type = typeof(TCtor);

        // ...
    }
}

И затем используете его следующим образом:

new BaseService().getAll(DataClass); // instead of 'getAll<DataClass>()'

Демонстрация на игровой площадке

Тип new (...args: any[]) => T просто говорит: новый тип (т.е. класс / конструктор), который возвращает универсальный тип T (другими словами,соответствующий класс / конструктор для универсального T типа экземпляра).

...