Сначала вы можете создать тип для запроса класса с определением returnType
(свойство stati c):
type ClassWithReturnType = { new(...args: any[]): any; returnType: any; };
, затем вы знаете, что вы можете извлечь returnType
с выводом Примерно так:
type ClassReturnType<T extends ClassWithReturnType> = T['returnType'] extends infer R ? R : never;
На данный момент вам просто нужно изменить объявление функции на:
function register<T extends ClassWithReturnType>(constructor: T, ...args: ConstructorParameters<T>): ClassReturnType<T> {
return (new constructor(...args));
}
Однако, для меня странно то, что вы звоните new constructor()
и ожидая, что returnType
отличается от T
. Это невозможно, поскольку конструктор возвращает экземпляр класса T. Может быть, вы хотите использовать это для других методов / stati c, однако я надеюсь, что это ответит на ваш вопрос.
Полный код: Playground Link
type ClassWithReturnType = { new(...args: any[]): any; returnType: any; };
type ClassReturnType<T extends ClassWithReturnType> = T['returnType'] extends infer R ? R : never;
function register<T extends ClassWithReturnType>(constructor: T, ...args: ConstructorParameters<T>): ClassReturnType<T> {
return (new constructor(...args));
}
class Clazz {
static returnType: Date;
constructor(p1: string, p2: number, p3: object) { }
}
let foo = register(Clazz, "", 1, {});