Как ввести метод для возврата примитива или экземпляра переданного класса?

#typescript

#typescript

Вопрос:

У меня есть универсальный класс с методом, который должен возвращать либо примитивы (в случае, если параметр является объектом-оболочкой для примитивного типа (например, Number)), либо экземпляр переданного конструктора.

Вот что я пробовал:

 /* eslint-disable @typescript-eslint/ban-types */
type returnPrimitive<T extends any> = T extends String ? string
  : T extends Number ? number
  : T extends Boolean ? boolean
  : T
/* eslint-enable */

type ctor<T = any> = {
  new(...args: any[]): T amp; { valueOf(): returnPrimitive<T>}
  [s: string]: any
}


class Foo<T> {
  Type: ctor<T>
  constructor (Type: ctor<T>) {
    this.Type = Type
  }

  getValue(val: any): returnPrimitive<T> {
    const a = new this.Type(val)
    // cast to primitive or return a
  }
}
 

Однако на самом деле это работает не так, как ожидалось. Я хочу, чтобы он автоматически подбирал тип через параметр type в конструкторе. Это хорошо работает, когда я передаю Number или другую примитивную оболочку, но хочу вернуть конструктор вместо экземпляра для любого другого класса, который я передаю.

 class Matrix{}
new Foo(Number).getValue() // correctly returns number
new Foo(Matrix).getValue() // returns typeof Matrix instead of Matrix
 

Как я могу это исправить?

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

1. Какую версию компилятора TS вы используете?

2. Установлена версия 4.0.5, но проблем с установкой обновлений нет

3. Какой тип вы хотите вернуть Matrix , например, при передаче? Тип класса или тип экземпляра?

4. Экземпляр матрицы

5. Чего именно вы пытаетесь достичь? Зачем вам это нужно?