如何在Typescript 2.8中使用Flux Container.create

时间:2018-05-15 18:57:22

标签: reactjs typescript flux

我正在尝试将我的react / flux项目从typescript 2.2更新到2.8。

我使用container.create实用程序函数定义了一个商店:

import * as React from 'react';
import { Container } from 'flux/utils';

export let MyContainer = Container.create(class extends React.Component<props, state> {
    static getStores() {
        return [/* list of stores here*/]
    }

    static calculateState(prevState: state, props: props): state {
        return {hello: true}
    }

    render() {
        return <div>something</div>
    }
}, { withProps: true });

如果我导出此组件并尝试使用它,我会收到以下错误:

TS2605: JSX element type 'Component<props, ComponentState>' is not a constructor function for JSX elements.

当我在使用typescript 2.2时这很好用,但是在更新之后我到处都会遇到错误,我尝试使用像这样的容器组件。

我正在使用@ types / react typings 15.0.28版。 Here are the definitions for Flux Containers.

1 个答案:

答案 0 :(得分:3)

显然从typescript 2.6开始会出现此错误。但我不确定这种行为会导致什么样的突然变化,match似乎没有。

根本原因是:

let readOnlyOrVoid: Readonly<void | {}> // resolves to void | Readonly<{}>
let readOnlyOfAny: Readonly<any> // in 2.5 this resolves to any, in 2.6 it does not we still have Readonly<any>
readOnlyOfAny = readOnlyOrVoid; // valid in 2.5, not so in 2.6

关联回ReactComponentState在15.0.23中定义为:

type ComponentState = {} | void ;

虽然state JSX.ElementClass(扩展React.Component<any, any>)的Readonly<any>类型为Container.create

由于ComponentState将返回状态为Readonly<void | {}>的包装组件,因此我们遇到了将Readonly<any>(从包装组件)分配到JSX.ElementClass(来自react)的定义

最简单的解决方案是更新15.0.39ComponentState的输入内容,将type ComponentState = {}; 的定义替换为:{/ p>

String[] parts = str.split("(?<=\\})--(?=\\{)");