【发布时间】:2018-11-16 04:33:03
【问题描述】:
使用此代码:
else if (event.target.id == 'filter') {
this.setState({ [event.target.id]: event.target.value });
我收到此打字稿错误: TS2345 TypeScript (TS) 类型参数 '{ [x: number]: any; }' 不能分配给 '{ id: number; 类型的参数;重定向:布尔值;过滤器:字符串;播放器:播放器; } | (((prevState: Reado...'.' ...
但如果我改为这样做:
else if (event.target.id == 'filter') {
this.setState({ filter: event.target.value });
没有错误。尽管出现错误,但代码运行良好。我认为这是从 TypeScript 2.9 开始的。我意识到我可以只使用第二个示例,但我还有其他代码,例如:
handleChange(event) {
if (event.target.type == 'checkbox') {
this.setState({ [event.target.id]: event.target.checked });
} else {
this.setState({ [event.target.id]: event.target.value });
}
}
这很有用。在 TypeScript 2.9 中有没有更好的方法来做到这一点?
更新:也相关:
type PlayerListState = {
id: number,
redirect: boolean,
filter: string,
player: GamePlayer
};
class PlayerListComponent extends React.Component<PlayerListProps, PlayerListState> {
以及来自 React 的 SetState 的类型定义:
setState<K extends keyof S>(
state: ((prevState: Readonly<S>, props: P) => (Pick<S, K> | S | null)) | (Pick<S, K> | S | null),
callback?: () => void
): void;
【问题讨论】:
-
...等等,
id不是number吗?它如何等于字符串"filter"? -
这是 DOM 元素 ID。
-
好吧,有道理
-
不过,如果您的错误是
Argument of type '{[x: number]: any;}...,则意味着 TypeScript 认为event.target.id是number。您确定该错误消息吗?
标签: typescript