我将此接口(interface)定义为我的状态:
interface State {
id: string;
name: string;
description: string;
dimensionID: string;
file: File | null;
operator: string;
isFormValid: boolean;
filename: string;
};
我有一个简单的更改处理程序:
update = (event: React.FormEvent<HTMLInputElement>): void => {
const { name, value } = event.currentTarget;
this.setState({ [name]: value });
};
但是,会抛出此错误:
Error:(109, 19) TS2345: Argument of type '{ [x: string]: string; }' is not assignable to parameter of type 'State | Pick<State, "id" | "name" | "description" | "dimensionID" | "file" | "operator" | "isFormValid" | "filename"> | ((prevState: Readonly<State>, props: Readonly<Props>) => State | Pick<...>)'.
Type '{ [x: string]: string; }' is not assignable to type '(prevState: Readonly<State>, props: Readonly<Props>) => State | Pick<State, "id" | "name" | "description" | "dimensionID" | "file" | "operator" | "isFormValid" | "filename">'.
Type '{ [x: string]: string; }' provides no match for the signature '(prevState: Readonly<State>, props: Readonly<Props>): State | Pick<State, "id" | "name" | "description" | "dimensionID" | "file" | "operator" | "isFormValid" | "filename">'.
我的问题是:如何像更改处理程序尝试的那样动态设置状态? 此处理程序用于表单的不同部分,因此我不知道需要更新哪个状态键。
更新:解决方案 从这个post
update = (event: React.FormEvent<HTMLInputElement>): void => {
const { name, value } = event.currentTarget;
this.setState(prevState => ({
...prevState,
[name]: value,
}))
};
有效!
最佳答案
最喜欢的解决方案类型转换。
this.setState({[name]: value} as {[P in keyof State]: State[P]})
// or
this.setState({[name]: value} as Pick<State, keyof State>)
setState 与传播前一个状态
this.setState((prevState) => ({ ...prevState, [name]: value }));
这不会检查类型。对于遇到转译困难的人来说,这只是一种快速解决方法。
this.setState<never>({[name]: value})
相关链接
关于reactjs - Typescript & ReactJS 如何动态设置状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53039935/