【发布时间】:2017-06-24 17:13:02
【问题描述】:
最新的@types/react (v15.0.6) 利用TypeScript 2.1 中为setState 添加的功能,即Pick<S, K>。这是一件好事,因为现在打字是正确的,因为在更新之前打字“不知道”setState 正在合并 this.state,而不是替换它。
此外,使用Pick 使setState 函数在允许输入方面非常严格。无法再向 state 添加未在组件定义中定义的属性(React.Component 的第二个泛型。
但定义动态更新处理程序也比较困难。例如:
import * as React from 'react';
interface Person {
name: string;
age: number|undefined;
}
export default class PersonComponent extends React.Component<void, Person> {
constructor(props:any) {
super(props);
this.state = {
name: '',
age: undefined
};
this.handleUpdate = this.handleUpdate.bind(this);
}
handleUpdate (e:React.SyntheticEvent<HTMLInputElement>) {
const key = e.currentTarget.name as keyof Person;
const value = e.currentTarget.value;
this.setState({ [key]: value });
}
render() {
return (
<form>
<input type="text" name="name" value={this.state.name} onChange={this.handleUpdate} />
<input type="text" name="age" value={this.state.age} onChange={this.handleUpdate} />
</form>
);
}
}
setState 函数会抛出以下错误
[ts] Argument of type '{ [x: string]: string; }' is not assignable
to parameter of type 'Pick<Person, "name" | "age">'.
Property 'name' is missing in type '{ [x: string]: string; }'.
即使key 的类型是"name" | "age"。
除了有一个单独的updateName 和updateAge 函数之外,我找不到解决方案。有谁知道如何将Pick 与动态键值一起使用?
【问题讨论】:
标签: reactjs generics typescript components