この問題を検索すると、this.setState()
を使用する代わりに、メソッド本体のどこかでthis.state
を直接変更する質問のみを見つけることができます。私の問題は、コンストラクターで次のように開始状態を設定することです。
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の公式のリアクションチュートリアルはthis.state
に直接割り当てられ、コンストラクターで行うことが許容されるパターンであると述べていますが、TypeScriptでこれを行う方法はわかりません。
これは、コミットで導入された@types/react
の最近の変更のように見えます 542f3c TypeScript サポートしない 親の割り当て派生コンストラクターの読み取り専用フィールド。
@types/react
の以前のバージョンにロールバックすることをお勧めします。バージョン16.4.2
は、不幸な変更が行われる前の最後のバージョンのようです。
^
からpackage.json
を削除することでバージョンを固定できます:
"devDependencies": {
...
"@types/react": "16.4.2",
DefinitelyTyped github pull request page でこの変更に関する議論もチェックしてください。
ロールバックする前に(@torvinの答えで示唆されているように)、 https://github.com/DefinitelyTyped/DefinitelyTyped/pull/26813#issuecomment-400795486 を読んでください。
これは回帰を意図したものではありませんでした-解決策はstate
をpropertyとして使用することです。次の理由により、以前のアプローチ(コンストラクタで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() {
//...
}
}