質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1572閲覧

配列に含まれるnullかundefinedを取り除いた配列を生成したい

whoiwhoi

総合スコア48

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2021/09/17 00:08

前提・該当のソースコード

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)[]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

しかしVScodeは変わらず、deleteUndfiedDataRawsの型を下記のように推論します。

取るべき手段は2つに1つです。

  • as DataType[]として型を切り替える
  • (data: DataType | null): data is DataType => !!dataのように、filterに使う関数に型を付与する

投稿2021/09/17 01:08

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問