如何使用 React 的 setState() 修复 linting 错误
How to fix linting error with React's setState()
我正在尝试找出在检查我的 React TypeScript 项目时遇到的错误。设置状态时问题出在组件内:
this.setState({dialogStatus: DialogNoConfigurationFileStatus.Create});
linting 时出现的错误:
Property 'creationStep' is missing in type '{ dialogStatus: DialogNoConfigurationFileStatus.Create; }'.
Error at src/dialogs/dialog-no-configuration-file.tsx:137:23: Argument of type '{ creationStep: number; }' is not assignable to parameter of type 'DialogNoConfigurationFileState'.
组件结构:
export interface DialogNoConfigurationFileState {
dialogStatus: DialogNoConfigurationFileStatus;
creationStep: number;
}
export class DialogNoConfigurationFile extends React.Component<DialogNoConfigurationFileProps, DialogNoConfigurationFileState> {
public constructor(props: any) {
super(props);
this.state = {
dialogStatus: DialogNoConfigurationFileStatus.Enter,
creationStep: 0
};
}
...
}
我的假设是我得到了 linting 错误,因为界面 DialogNoConfigurationFileState 中的两个参数都是强制性的。将它们都设置为可选时,错误消失了:
export interface DialogNoConfigurationFileState {
dialogStatus?: DialogNoConfigurationFileStatus;
creationStep?: number;
}
不过我想让它们成为强制性的。这样做的原因是,因为我想在构造函数中强制创建状态。这样我就可以确定在从组件内部访问 this.state.creationStep
时设置了状态。如果我将状态参数设置为可选,我必须首先检查状态和状态参数是否已分配。我想避免的步骤。
在这里最好的事情是什么?我在这里无意识地创建了错误的代码吗?即使 linting 失败,代码仍然运行良好,但 TSLint 背后的人一定有这个错误背后的想法。
有人可以详细说明一下吗?
编辑 1:
这是枚举 DialogNoConfigurationFileStatus:
export enum DialogNoConfigurationFileStatus {
Enter,
Create,
}
如果您使用的是 latest TypeScript definitions for React(撰写本文时为 16.8.5),那么这应该不再是问题 - 旧定义不允许 'partial' 更新状态,但这在某些时候是固定的。
如果无法更新,并且您确实希望保留必填字段,则可以使用强制转换作为解决方法来消除类型错误
this.setState({
dialogStatus: DialogNoConfigurationFileStatus.Create
} as DialogNoConfigurationFileState);
这基本上告诉 TypeScript:
Trust me, this is a valid DialogNoConfigurationFileState
, I know what I'm doing.
我正在尝试找出在检查我的 React TypeScript 项目时遇到的错误。设置状态时问题出在组件内:
this.setState({dialogStatus: DialogNoConfigurationFileStatus.Create});
linting 时出现的错误:
Property 'creationStep' is missing in type '{ dialogStatus: DialogNoConfigurationFileStatus.Create; }'.
Error at src/dialogs/dialog-no-configuration-file.tsx:137:23: Argument of type '{ creationStep: number; }' is not assignable to parameter of type 'DialogNoConfigurationFileState'.
组件结构:
export interface DialogNoConfigurationFileState {
dialogStatus: DialogNoConfigurationFileStatus;
creationStep: number;
}
export class DialogNoConfigurationFile extends React.Component<DialogNoConfigurationFileProps, DialogNoConfigurationFileState> {
public constructor(props: any) {
super(props);
this.state = {
dialogStatus: DialogNoConfigurationFileStatus.Enter,
creationStep: 0
};
}
...
}
我的假设是我得到了 linting 错误,因为界面 DialogNoConfigurationFileState 中的两个参数都是强制性的。将它们都设置为可选时,错误消失了:
export interface DialogNoConfigurationFileState {
dialogStatus?: DialogNoConfigurationFileStatus;
creationStep?: number;
}
不过我想让它们成为强制性的。这样做的原因是,因为我想在构造函数中强制创建状态。这样我就可以确定在从组件内部访问 this.state.creationStep
时设置了状态。如果我将状态参数设置为可选,我必须首先检查状态和状态参数是否已分配。我想避免的步骤。
在这里最好的事情是什么?我在这里无意识地创建了错误的代码吗?即使 linting 失败,代码仍然运行良好,但 TSLint 背后的人一定有这个错误背后的想法。
有人可以详细说明一下吗?
编辑 1:
这是枚举 DialogNoConfigurationFileStatus:
export enum DialogNoConfigurationFileStatus {
Enter,
Create,
}
如果您使用的是 latest TypeScript definitions for React(撰写本文时为 16.8.5),那么这应该不再是问题 - 旧定义不允许 'partial' 更新状态,但这在某些时候是固定的。
如果无法更新,并且您确实希望保留必填字段,则可以使用强制转换作为解决方法来消除类型错误
this.setState({
dialogStatus: DialogNoConfigurationFileStatus.Create
} as DialogNoConfigurationFileState);
这基本上告诉 TypeScript:
Trust me, this is a valid
DialogNoConfigurationFileState
, I know what I'm doing.