打字稿推断方法返回类型并将其应用于属性

时间:2020-12-29 14:02:29

标签: typescript typescript-typings

我有这门课:

class Element<T extends IElement = {}> {
    thisIsAProp:T;
    renderResult:string = null;
    render() {
        return "thing";
    }
}

class NewElement extends Element {
    render() {
        return 123;
    }
}

在内部,当调用 render() 时,其结果存储在 renderResult 中。问题是我希望 renderResult 成为 render() 返回值的类型。如您所见,在 NewElement 中,返回类型是一个数字,所以我希望 renderResult 是一个数字。我试过这个:

class Element<T extends IElement = {}, R extends string|number = null> {
    thisIsAProp:T;
    renderResult:R = null;
    render():R {
        return "thing";
    }
}

class NewElement extends Element {
    render() {
        return 123;
    }
}

我只是想将 render() 类型推断为泛型 R(就像您对 function<X>(arg:X):X 所做的那样)并将该泛型应用于 renderResult 属性,但是我无法实现它。它抛出Element.render()

Type 'string' is not assignable to type 'R'. 'string' is assignable to the constraint of type 'R', but 'R' could be instantiated with a different subtype of constraint 'string | number'

并在NewElement.render()中:

Property 'render' in type 'NewElement' is not assignable to the same property in base type 'Element<null>'. Type '() => number' is not assignable to type '() => null'. Type 'number' is not assignable to type 'null'.

因此,本质上,不是选择 render() 返回类型并将其应用于 R,而是尝试将 R 应用于 render() 返回类型。我在这里有点迷茫,因为我无法在任何地方添加 infer 关键字来强制它推断 R 的返回类型。

我想要的另一件事是保留默认的通用值,以避免在代码周围添加 Element<X, Y>

0 个答案:

没有答案