我正在尝试将我的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.
答案 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
关联回React
,ComponentState
在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.39
至ComponentState
的输入内容,将type ComponentState = {};
的定义替换为:{/ p>
String[] parts = str.split("(?<=\\})--(?=\\{)");