jhipster反应形式onChange状态'{[x:number]类型的参数:任意; }'不可分配

时间:2018-09-07 08:13:48

标签: javascript reactjs typescript redux jhipster

我是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个字段,那将是一个问题,这就是为什么我试图直接从我的e.target.name中的onChange获取状态字段的名称的原因。但是,这给了我错误:

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

如何摆脱这个错误?是否可以像我尝试过的那样用一根衬纸优雅地解决?

1 个答案:

答案 0 :(得分:1)

第一部分是修复e的类型。我们可以使用类型查询来告诉打字稿类型与onChange的{​​{1}}:input

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

的键
IMyClassState

上面的代码不起作用,因为typescript仍将推断对象文字的类型为onChange: JSX.IntrinsicElements['input']['onChange'] = (e) => { this.setState({ [e.target.name as keyof IMyClassState]: e.target.value }); }; 。使编译器推断出我们想要的类型的唯一方法是将{ [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
};