【问题标题】:Typescript generic type constraint from array of types来自类型数组的 Typescript 泛型类型约束
【发布时间】:2020-05-30 19:53:31
【问题描述】:

我有一个声明为类型的数组

const APIS = [NewsApi, CommentsApi, FileApi];

我希望有一个方法可以从 APIS 数组中接受其中一种类型,如下所示:

myMethod<T extends anyof APIS>(apiType: T): T {
    const api = new apiType(); //pseudo code, does not work off course
    // some common configuration code
    return api;
} 

。我不能做myMethod&lt;T extends NewsApi|CommentsApi&gt;(): T,因为 APIS 数组是自动生成的。打字稿可以做到这一点吗?

更新:

Aleksey 的解决方案非常适合传入输入。但是,无法从用法中推断出返回类型。

const myApi = myMethod(NewsApi);

在上述情况下,myApi 的类型不是NewsApi,而是NewsApi|CommentsApi|FileApi。 是否可以将返回类型显式设置为输入 api 类型的实例?

【问题讨论】:

    标签: typescript generics typescript-generics type-constraints


    【解决方案1】:

    如果您可以将数组的定义更改为只读元组:

    const APIS = [NewsApi, CommentsApi, FileApi] as const;
    

    然后您可以使用查找类型获得可能的数组值的联合:

    type ApiConstructors = typeof APIS[number];
    
    function myMethod<T extends InstanceType<ApiConstructors>>(apiType: new () => T): T {
      return new apiType();
    }
    
    const api = myMethod(NewsApi); // api is of type NewsApi
    

    InstanceType 实用程序用于获取构造函数的实例类型。

    Playground

    【讨论】:

    • 谢谢@Aleksey :)。另外,是否可以将方法的返回类型显式设置为 api 类型的实例?我知道返回类型将从返回的对象中隐式推断。只是想知道,如果它也可以显式设置,以防我声明一个接口。
    • 刚刚注意到返回类型并没有完全从用法中推断出来。当我声明 const myApi = myMethod(NewsApi); myApi 不被推断为 NewsApi,而是所有 api 的联合。
    • 我稍后会检查这个,但这不是你最初问的?
    • 我同意,我首先应该更具体。对此感到抱歉。 :)
    • @VictorMukherjee 我已经更新了答案和操场
    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    相关资源
    最近更新 更多