允许TypeScript从工厂推断类型

时间:2018-10-30 17:20:57

标签: typescript types inference

TypeScript是否可以从静态函数推断返回类型。例如,如果我有一个静态的User.fromId()函数,它将返回一个User对象。但我想将其通过另一个函数(称为builder)传递-例如:

builder(User.fromId, values);

其中builder定义为:

function builder( construct: Function, values: any ) {
   var inst = construct();
   // set values
   return inst;
}

如何让TypeScript来“知道” builder将返回User而不传递User作为泛型?也许可以,但是使用Function作为第一个参数的类型是问题吗?如果是这样,可以在没有泛型的情况下进行推断,我知道可以使用泛型来定义返回类型(但是感觉很多余)。

谢谢!

1 个答案:

答案 0 :(得分:5)

如果使用通用类型参数和适当的函数签名,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