#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. Чего именно вы пытаетесь достичь? Зачем вам это нужно?