泛型类型推断的Typescript泛型

时间:2019-04-13 07:07:03

标签: typescript generics

我有一个通用类Generic<T>和另一个通用类,其中另一个通用类是GenericWrap<U extends Generic<any>作为通用类型。它有一个Generic<any>作为成员。 (请参见下面的代码)

现在NumberGenericWrap用通用类型GenericWrap扩展了<NumberGeneric>。此时,我希望NumerGenericWrap.generic的类型为Generic<number>,因此NumberGenericWrap.getValue()的返回类型可以为number。但最终以any类型结束。

打字稿支持吗?

class Generic<T> {
    val: T;
}

class NumberGeneric extends Generic<number> {

}

class GenericWrap<U extends Generic<any>> {

    generic: U;

    getValue() {
        return this.generic.val;
    }
}

class NumberGenericWrap extends GenericWrap<NumberGeneric> {

}

let n = new NumberGenericWrap();

// expected 'typeof val' => number 
// actual 'typeof val' => any
let val = n.getValue();

1 个答案:

答案 0 :(得分:1)

我不知道为什么类型检查器不尝试推断val类型,但是它有解决方法。只需告诉类型检查器对该通用类型进行查找并找到val类型即可。

type ValType<T extends Generic<any>> = T["val"];

class GenericWrap<U extends Generic<any>> {

    generic: U;

    getValue(): ValType<U> {
        return this.generic.val;
    }
}