前提・該当のソースコード
ReactとTypeScriptとFirebaseを使っています。
datasコレクションからデータを取得する際、ドキュメントに含まれるuidからユーザー情報も取得し、データ情報とユーザー情報をオブジェクトにまとめた配列を生成しています。
typescript
1type UserType = { 2 uid: string; 3 name: string; 4} 5type DataType = { 6 dataID: string; 7 dataUser: User; 8} 9 10cosnt [datas, setDatas] = useState<DataType[]>([]); 11useEffect(() => { 12 const loadDatas = async () => { 13 const currentApp = getApp(); 14 const db = getFirestore(currentApp); 15 const dataRef = doc(collection(db, "datas")); 16 const dataDocs= await getDocs(dataRef); 17 const dataRaws = await Promise.all( 18 dataDocs.docs.map(async (doc) => { 19 const data = doc.data(); 20 const { dataID } = data; 21 const dataUserRef = doc(collection(db, "users"), dataID); 22 const dataUserDoc = await getDoc(dataUserRef).catch((err) => { 23 console.log(err); 24 return null; 25 }); 26 if (!dataUserDoc || !dataUserDoc.exists()) return; 27 const dataUser = dataUserDoc.data() as UserType; 28 const dataObj: DataType = { 29 dataID: dataID, 30 dataUser: dataUser, 31 }; 32 return dataObj; 33 }) 34 ); 35 if (dataRaws.length > 0) setDatas(dataRaws); 36 }; 37 loadDatas(); 38}, []);
発生している問題・エラーメッセージ
Array.map処理の中で「ユーザー情報のgetに失敗した場合はnullを返してその値の処理をスルーする」という処理を書いているため、VSCodeはdataRaws
の型を以下のように推論します。
dataRaws: (DataType | undefined)[]
そのため、setDatas(dataRaws)
に対してVSCodeに下記の内容で怒られます。
型 '(DataType | undefined)[]' の引数を型 'SetStateAction<DataType[]>' のパラメーターに割り当てることはできません。 型 '(DataType | undefined)[]' を型 'DataType[]' に割り当てることはできません。 型 'DataType | undefined' を型 'DataType' に割り当てることはできません。 型 'undefined' を型 'DataType' に割り当てることはできません。 ts(2345)
実現したいこと
dataRawsからundefinedを取り除き、DataType
だけが格納された配列をsetStateしたいです。
試したこと
JavaScriptにおける配列の空要素除去filterパターン - Qiita
上記ページで紹介されている3パターンを試してみました。
typescript
1if (dataRaws.length < 1) return; 2const deleteUndfiedDataRaws = dataRaws.filter(data => data); 3// const deleteUndfiedDataRaws = dataRaws.filter(data => !!data); 4// const deleteUndfiedDataRaws = dataRaws.filter(Boolean); 5setDatas(deleteUndfiedDataRaws);
しかしVScodeは変わらず、deleteUndfiedDataRaws
の型を下記のように推論します。
deleteUndfiedDataRaws: (DataType | undefined)[]
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。