前提・実現したいこと
React×TypeScript
hooksを用いてシステムを作成しています。
TypeScriptBでapi通信をした後、返却値をTypeScriptAで受け取り、
setSkillsでstateを更新できるように型を定義できることが、実現したいゴールです。
問題は、
await setSkills(res.data);
にて型定義Errorが起きます。
以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
プロパティ 'data' は型 '(dispatch: Dispatch<any>) => Promise<number[]>' に存在しません。ts(2339)
該当のソースコード
TypeScriptA
1const Dashboard = () => { 2 const [skills, setSkills] = useState<[]>([]); 3 const user = useSelector((state: RootState) => state.auth.user); 4 const dispatch = useDispatch(); 5 useEffect(() => { 6 let didCancel = false; 7 8 (async () => { 9 if (user && user.id) { 10 const res = await getOwnSkillIds(user.id); 11 if (!didCancel) { 12 await setSkills(res.data); 13 } 14 } 15 })(); 16 17 return () => { 18 didCancel = true; 19 }; 20 }, [skills]); 21 22-----(後略)------ 23} 24
TypeScriptB
1 useEffect(() => { 2 let didCancel = false; 3 4 (async () => { 5 if (user && user.id) { 6 const res = await getOwnSkillIds(user.id); 7 if (!didCancel) { 8 await setSkills(res.data); 9 } 10 } 11 })(); 12 13 return () => { 14 didCancel = true; 15 }; 16 }, [skills]); 17
Typescript
1export function getOwnSkillIds(userId: number) { 2 return async function(dispatch: Dispatch<any>) { 3 try { 4 const response = await baseAxios.get<[]>( 5 `/skills/own_skill_ids/${userId}`, 6 {} 7 ); 8 9 return response.data; 10 } catch (err) { 11 return []; 12 // エラー処理 13 } 14 }; 15}
試したこと
await/async 以外の書き方を試してみる(Promiseなど)
Promise.resolve()の書き方で解決できないか?
ただ、jsの非同期処理の本質がわかっていないためか、どの方法でも、型エラーを解決できませんでした。
非同期処理をawait/asyncで記載した場合には戻り値はどのように扱えばよいのでしょうか?
または別の解決方法がありましたらご教授頂けますと幸いです。
補足情報(FW/ツールのバージョンなど)
React
TypeScript
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/29 06:16
2020/01/29 06:29
2020/01/30 13:20