発生している問題
filteredNames1
, filteredNames2
, filteredUserNames2
は期待通りの動作をしています。
しかし、filteredUserNames1
は型が (string | null)[]
のままになっており、nullが消えていません。
string[]
になる事を期待していました。
filterを先に実行してからmapを実行したい場合も今後あると思います。
filterを後に書かなければ現状型が正しくありません。
filterを先に書いても型が正しくなる方法はありますか?
それとも、filterを先に書いた場合はnullになる事がありえるのでしょうか?(私は無いと思っていますが)
該当のソースコード
typescript
1 2const names = [ 'a', 'b', null] 3 4const filteredNames1 = names 5 .filter(name => name !== null) 6 .map(name => name) 7// const filteredNames1: string[] 8 9const filteredNames2 = names 10 .map(name => name) 11 .filter(name => name !== null) 12// const filteredNames2: string[] 13 14// ----------------------------------- 15interface User { 16 id: number; 17 name: string | null; 18} 19 20const users: User[] = [ 21 { id: 1, name: '田中太郎' }, 22 { id: 2, name: '山田太郎' }, 23 { id: 3, name: null }, 24] 25 26const filteredUserNames1 = users 27 .filter(user => user.name !== null) 28 .map(user => user.name) 29// const filteredUserNames1: (string | null)[] 30 31const filteredUserNames2 = users 32 .map(user => user.name) 33 .filter(userId => userId !== null) 34// const filteredUserNames2: string[] 35 36
試したこと
- 上記のようなサンプルプログラムを作成しました。実行結果からobjectの場合はfilterの順序が大事になってくると思いました。
補足情報(FW/ツールのバージョンなど)
- TypeScript 5.6.2
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。