当我对此问题进行搜索时,只能找到直接在方法正文中某个地方修改this.state
而不是使用this.setState()
的问题。我的问题是我想按如下所示在构造函数中设置开始状态:
export default class Square extends React.Component<any, any> {
constructor(props: any) {
super(props);
this.state = {
active: false
};
}
public render() {
...
}
}
应用程序无法启动,并出现以下编译错误:
Cannot assign to 'state' because it is a constant or a read-only property
这是因为在React.Component
的定义中,我们有:
readonly state: null | Readonly<S>;
所以我不确定该怎么做。 JS中的官方react教程直接分配给this.state
,并说在构造函数中这样做是可以接受的模式,但是我不知道如何使用TypeScript做到这一点。
答案 0 :(得分:31)
考虑到Typescript 542f3c0在派生构造函数中分配父级的只读字段这一事实,这似乎是提交doesn't support中引入的@types/react
的最新变化,效果不佳。
我建议回退到@types/react
的先前版本。版本16.4.2
似乎是不幸的更改之前的最后一个版本。
您可以通过删除^
中的package.json
来固定版本:
"devDependencies": {
...
"@types/react": "16.4.2",
也请查看有关DefinitelyTyped github pull request page上有关此更改的讨论
答案 1 :(得分:27)
在回滚之前(如@torvin的答案所建议),请通读https://github.com/DefinitelyTyped/DefinitelyTyped/pull/26813#issuecomment-400795486。
这并不意味着回归-解决方案是将state
用作属性。比以前的方法(在构造函数中设置state
)要好,因为:
例如:
type Props {}
type State {
active: boolean
}
export default class Square extends React.Component<Props, State> {
public readonly state: State = {
active: false
}
public render() {
//...
}
}
另一种方法:
type Props {}
const InitialState = {
active: false
}
type State = typeof InitialState
export default class Square extends React.Component<Props, State> {
public readonly state = InitialState
public render() {
//...
}
}
答案 2 :(得分:0)
由于state
是组件的只读属性,因此无法逐字段进行设置,但是您仍然可以这样做:
constructor(props: MyProps) {
super(props);
this.state = {
// include properties here
}
}