Extract<T, U> - ユニオン型で列挙したリテラル型をコピペせずに参照する
code:step-1.ts
type SectionType = "image" | "banner";
export type ImageSection = {
type: "image";
path: string;
};
export type BannerSection = {
type: "banner";
path: string;
href: string;
};
export type Section = ImageSection | BannerSection;
step-1.tsではプログラマーが"image"と"banner"の値を間違えないように気をつけている。気をつけ損ねてしまうと・・・
code:step-2.ts
type SectionType = "image" | "banner";
export type ImageSection = {
type: "imagee"; // ee になってしまった
path: string;
};
step-2.tsではtypoしてしまっているが、ふたつの型が関連付けられておらず、別々に定義されているので、コンパイル時にエラーにならない。そこで、ふたつの型を関連付けると・・・
code:step-3.ts
type SectionType = "image" | "banner";
export type ImageSection = {
type: Extract<SectionType, "imagee">;
path: string;
};
const section1: ImageSection = {
type: "image", // Error
path: "//path/to"
};
const section2: ImageSection = {
type: "imagee", // Error
path: "//path/to"
};