【问题标题】:How to unwrap a typescript generic internal type如何解开打字稿通用内部类型
【发布时间】:2019-01-22 03:33:13
【问题描述】:

我有一个泛型类图,其中需要包装类型来指定其他类。

interface Data {
    id: number,
}

class EntityClass<T extends Data> {
    public data;

    constructor(data: T) {
        this.data = data;
    }
}

class Result<T extends Data> {
    public data

    constructor(data) {
        this.data = data;
    }
}

现在我同时传递了类型 (EntityClass&lt;any&gt; 和内部类型 (DataClass),尽管它始终与此处的 any 匹配。

function extract<Class extends EntityClass<any>, DataClass extends Data>(
    entity: Class
) : Result<DataClass> {}

有没有办法“解开”EntityClass 的内部类型,以避免两者都通过?这是我想做的事情:

function extract<Class extends EntityClass<InternalClass>>(
    entity: Class
) : Result<InternalClass> {}

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    这是条件类型及其推理行为的基本应用

    class EntityClass<T extends Data> {
        public data: T; // T assuming this should be T
    
        constructor(data: T) {
            this.data = data;
        }
    }
    
    type GetDataClass<T  extends EntityClass<any>> = T  extends EntityClass<infer U > ? U: never;
    function extract<Class extends EntityClass<any>>(
        entity: Class
    ) : Result<GetDataClass<Class>> { return null as any}
    

    或者您也可以使用类型查询来执行此操作,但这意味着您将被绑定到data 字段,条件类型将根据结构提取泛型类型,而无需指定特定字段。

    function extract<Class extends EntityClass<any>>(
        entity: Class
    ) : Result<Class['data']> { return null as any}
    

    您可以阅读有关类型查询和条件类型的更多信息here

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2019-01-25
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 2023-02-07
      • 1970-01-01
      • 2019-08-04
      相关资源
      最近更新 更多