Если вы используете параметры универсального типа и соответствующую сигнатуру функции, Typescript выведет типы правильно
class User {
static fromId(id: number): User{
return new User()
}
}
function builder<T>(construct: (id:number) => T, values: any) {
var inst = construct(values);
// set values
return inst;
}
let u = builder(User.fromId, 0); //User
Мы можем даже вывести тип параметра при необходимости
function builder<T, TId>(construct: (id:TId) => T, values: TId) {
var inst = construct(values);
// set values
return inst;
}
let u = builder(User.fromId, 0);
let u2 = builder(User.fromId, '0'); // error
Если функция конструктора имеет больше параметров, мы можем даже вывести их при необходимости, используя кортежи в параметрах отдыха
class User {
static fromId(id: number, name: string): User{
return new User()
}
}
function builder<T, TArgs extends any[]>(construct: (...a:TArgs) => T, ...values: TArgs) {
var inst = construct(...values);
// set values
return inst;
}
let u = builder(User.fromId, 0, '');
let u2 = builder(User.fromId, '0'); // error