【问题标题】:Allowing TypeScript to infer type from a factory允许 TypeScript 从工厂推断类型
【发布时间】:2019-04-03 19:31:03
【问题描述】:

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 作为第一个参数的类型是问题吗?如果是这样,是否可以在没有泛型的情况下进行推理,我知道我可以使用泛型来定义返回类型(但感觉是多余的)。

谢谢!

【问题讨论】:

    标签: typescript types inference


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-03-08
      • 1970-01-01
      • 2018-07-03
      • 2019-05-28
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      相关资源
      最近更新 更多