gpt4 book ai didi

javascript - jhipster react 形式 onChange state 类型 '{ [x: number]: any; }' 的参数不可分配

转载 作者:行者123 更新时间:2023-12-03 01:10:47 25 4
gpt4 key购买 nike

我是 React 新手,在使用带有两个字段的表单设置状态时遇到了一些 jsx 问题,该表单执行 ajax 调用以将 json 对象(响应数据)放入状态的 field3 中。我有以下内容:

export interface IMyClassState {
field1: string;
field2: string;

field3: object;
}

export class MyClass extends React.Component<IMyClassProps, IMyClassState> {
state: IMyClassState = {
field1: '',
field2: '',

field3: null
}

...

onSubmit = e => {
e.preventDefault();
...
}

onChange = e => {
this.setState({ [e.target.name]: e.target.value });
};

...

render() {
return(
<form onSubmit={this.onSubmit}>
<input type="text" id="field1" name="field1" onChange={this.onChange}/>
<input type="text" id="field2" name="field2" onChange={this.onChange}/>
</form>
);
}
};

在只有两个字段的示例中,我想我可以有不同的 onChange ,如下所示:

<input type="text" id="field1" name="field1" onChange={this.onChangeField1}/>
...

但如果我有 100 个字段,那就是一个问题,这就是为什么我尝试直接从 onChange< 中的 e.target.name 获取状态字段的名称。然而,这给了我错误:

Argument of type '{ [x: number]: any; }' is not assignable to parameter of type 'IMyClassState | Pick<IMyClassState, "field1" | "field2" 

如何消除这个错误?是否可以像我尝试过的那样用一个衬垫优雅地解决问题?

最佳答案

第一部分是修复e的类型。我们可以使用类型查询来告诉 typescript 类型与 inputonChange 相同: onChange: JSX.IntrinsicElements['input']['onChange ']

第二部分是修复对象文字,推断为 { [x: string]: string; }。理想情况下,我们可以告诉编译器 e.target.nameIMyClassState

的键
onChange: JSX.IntrinsicElements['input']['onChange'] = (e) => {
this.setState({ [e.target.name as keyof IMyClassState]: e.target.value });
};

上面的代码不起作用,因为 typescript 仍然会推断对象文字的类型为 { [x: string]: string; }。让编译器推断我们想要的类型的唯一方法是将 e.target.name 转换为 IMyClassState 的特定字段。

onChange: JSX.IntrinsicElements['input']['onChange'] = (e) => {
this.setState({ [e.target.name as "field1"]: e.target.value }); // Ok now
};

虽然对编译器撒谎并不理想,但这是最简单的选择。另一种选择是仅转换对象文字。

onChange: JSX.IntrinsicElements['input']['onChange'] = (e) => {
this.setState({ [e.target.name]: e.target.value } as any as IMyClassState);
};

关于javascript - jhipster react 形式 onChange state 类型 '{ [x: number]: any; }' 的参数不可分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52218201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com