如何解开打字稿通用内部类型

时间:2018-08-15 08:47:22

标签: typescript typescript-generics

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

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<any>和内部类型(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> {}

1 个答案:

答案 0 :(得分:3)

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

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

的更多信息