我有这门课:
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>
。