[英]Property '0' is missing in type 'any[]' but required in type '[{ id: string; gp: boolean; }]
[英]Property is missing in type '{ [x: string]: string; }'
在這個反應應用程序中,有一個帶有幾個輸入字段的表單。 這些字段都使用this.handleChange
和onChange
屬性。
private handleChange = (event: React.FormEvent<HTMLInputElement>) => {
let target = event.target as HTMLInputElement;
this.setState({
[target.name]: target.value
});
};
我得到的打字稿錯誤是:
ERROR in [at-loader] ./src/components/FormSubmitHighScore.tsx:43:23
TS2345: Argument of type '{ [x: string]: string; }' is not assignable to parameter of type 'Pick<State, "first_name" | "last_name" | "email_address" | "school_name" | "region" | "submitted">'.
Property 'first_name' is missing in type '{ [x: string]: string; }'.
因此,通過動態設置狀態名稱字段(基於正在使用的輸入)這個 Typescript 錯誤被觸發(但它確實在瀏覽器中工作)。
在這種情況下,我將如何指定正確的類型?
為了避免“任何” linter 警告,我使用:
this.setState({
[target.name]: target.value
} as Pick<State, keyof State>);
將函數傳遞給 setState 也可以。 我的猜測是因為你在傳播狀態,所以打字稿知道它具有狀態的所有屬性。
this.setState(state => ({
...state,
[name]: value,
}));
我遇到了與您遇到的類似的錯誤。 這是我對更改處理程序的實現:
onChange = (name: keyof ComponentState, value: any) => {
this.setState(state => ({
...state,
[name]: value,
}));
};
當我使用typescript
react
編程語言來管理我的道具時,我遇到了同樣的問題。 我使用的是CBC
,所以我設法通過將狀態值設置為可選來解決這個問題。 這是我基於類的組件,我在其中跟蹤username
、 email
和password
的狀態:
interface Props {}
interface State {
username?: string;
email?: string;
password?: string;
}
export default class App extends React.Component<Props, State> {
constructor(props: any) {
super(props);
this.state = {
username: "",
password: "",
email: "",
};
}
onSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
};
onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target;
this.setState((state) => ({
...state,
[name]: value,
}));
};
render(): React.ReactNode {
const { username, password, email } = this.state;
return (
<div className="app">
<form onSubmit={this.onSubmit}>
<input
type="text"
placeholder="username"
name="username"
value={username}
onChange={this.onChange}
/>
<input
type="text"
placeholder="email"
name="email"
value={email}
onChange={this.onChange}
/>
<input
type="text"
placeholder="password"
name="password"
value={password}
onChange={this.onChange}
/>
<button type="submit">register</button>
</form>
</div>
);
}
}
通過在State
類型中設置可選字段,您不需要這樣做:
this.setState({
[name]: value
} as any);
因為typescript
知道如何處理這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.