Как получить параметр универсального типа в typescript?

#typescript #typescript-generics

Вопрос:

В приведенном ниже коде я хочу получить тип E. Но я не могу найти тип E.

 class A<E> {
  getParameterType() {
    // I want get type of E
  }
}

class B {
}

** Example **
new A<number>().getParameterType() // number
new A<B>().getParameterType() // B
 

Комментарии:

1. Это может быть полезно при определении типов: typescriptlang.org/docs/handbook/2/typeof-types.html

2. Я не думаю, что ты сможешь. Typescript работает только во время компиляции, ваша функция выполняется во время выполнения и, следовательно, не имеет доступа к ней.

Ответ №1:

Это типобезопасный подход для этого:

 class A<E> {
    constructor(public generic: E) { }
    getParameterType() {
        return this.generic
    }
}

class B {
}

const result1 = new A(42).getParameterType() // number
const result2 = new A(new B()).getParameterType() // B
 

Пожалуйста, имейте в виду, что небезопасно использовать явный универсальный, который не связан ни с каким аргументом:

 function fn<Char extends "a">(): Char {
    return "a" // error
}

const result = fn<'a' amp; { hello: 42 }>()

const check = result.hello // 42,but undefined in runtime
 

Здесь, в моей статье, вы можете узнать больше об умозаключении.