Array.filterの代わりにArray.flatMapを使うと、抽出したデータの型をTypeScriptで自動的に推論できる
ts
interface 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"
);