Array.filterの代わりにArray.flatMapを使うと、抽出したデータの型をTypeScriptで自動的に推論できる
tsinterface UserBase { name: string;}interface FreeUser extends UserBase { plan: "free";}interface ProUser extends UserBase { plan: "pro";}type User = FreeUser | ProUser;
const users: User[] = [ { plan: "free", name: "free会員1" }, { plan: "pro", name: "pro会員1" },];
// Array.filterを使って抽出したデータは User[]型 と推論される。const proUsersByFilter = users.filter((user) => user.plan === "pro");
// Array.flatMapを使って抽出したデータは ProUser[]型 と推論される。const proUsersByFlatMap = users.flatMap((user) => user.plan === "pro" ? [user] : []);
Array.filterを使う場合でも型ガードと併用することで、抽出したデータの型を指定できる。
しかし型を推論せず強制的に型を指定するため、実際に抽出されるデータの型と整合性がとれているかは保証されない。
ts// 型ガードによって ProUser[]型 になる。const proUsersByFilterAndTypeGuard = users.filter( (user): user is ProUser => user.plan === "pro");
// 型ガードによって ProUser[]型 になるが、実際にはFreeUserが抽出される。const invalidTypeGuard = users.filter( (user): user is ProUser => user.plan === "free");