【发布时间】:2019-03-18 06:45:54
【问题描述】:
我正在创建一堆内部包含一些常用功能的组件,其中一个是处理渲染的组件。简化后如下所示:
const render = (
instance: React.Component<{}, {flag: boolean}>,
cb: () => React.ReactNode
) => instance.state.flag ? cb() : '';
class Test extends React.Component<{}, {flag: boolean}> {
state = {flag: true};
render() { return render(this, () => '') }
}
不过,TypeScript 对此设置不满意,并表示:'render' implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions. 就我个人而言,我看不到此参考。
作为一个可能的线索,如果我这样重写这段代码:
const render = (
state: {flag: boolean},
cb: () => React.ReactNode
) => state.flag ? cb() : '';
class Test extends React.Component<{}, {flag: boolean}> {
state = {flag: true};
render() { return render(this.state, () => '') }
}
...一切都很好,但我真的很想使用组件本身,因为现在还没有看到一些复杂性。
有什么问题?我可以用这个通用函数做点什么,让 TypeScript 不争论吗?
UPD:一些测试让我创建了一个更接近所需示例的示例:
type Component<T> = React.Component<{}, {flag: T}>
const render = <T>(
instance: Component<T>,
cb: () => React.ReactNode
) => instance.state.flag ? cb() : '';
class Test extends React.Component<{}, {flag: boolean}> {
state = {flag: true};
render() {
const result = render(this, () => '');
return result;
}
inner = () => 'test';
}
这里的重点是,外部render 函数是泛型的,而instance 类型依赖于泛型参数,因此TypeScript 无法用适当的参数代替T。是否可以在不丢失类型安全的情况下帮助他?
【问题讨论】:
标签: reactjs typescript type-inference