reactjs - 使用 React hook useState() 正確地為 'setState' 函數定義類型的方法
我正在使用 React 和 TypeScript,剛好遇到了一個困境。我使用 React.useState() 鉤子來管理我的狀態,像這樣:
const [currentUser, setCurrentUser] = React.useState({} as User) // currentUser is of type User
我找到這種方式來輸入 setCurrentUser 函數:
setCurrentUser: React.Dispatch<React.SetStateAction<User>>
所以如果我嘗試使用這個函數並傳入像字串這樣的無效參數,我會得到這個錯誤:
Argument of type '"dummy string"' is not assignable to parameter of type 'SetStateAction<User>'
然後我找到了一個更簡單的方法:
setCurrentUser: React.Dispatch<User>
用這種方式,錯誤訊息也更容易閱讀:
Argument of type '"dummy string"' is not assignable to parameter of type 'User'
那麼哪一個才是正確/官方的方式來輸入這個 setState 鉤子函數呢?
答案#1
根據 React 定義:
type SetStateAction<S> = S | ((prevState: S) => S);
在你的例子中:
React.Dispatch<React.SetStateAction<User>> =
| React.Dispatch<User>
| React.Dispatch<(prevState: User) => User>;
那意味著你可以這樣做:
setUser({ name: 'UserName'});
或使用先前的值:
setUser(previousUser => {
return {
...previousUser,
surname: 'UserSurname'
}
});
通過將 dispatch 宣告為 setUser: React.Dispatch<User>,你就無法使用第二個版本。
