Xを眺めていたら、こんなポストが流れてきました。
お、これがあれば型が作れる。
ということで、作ってみました。
// サイズ
type Size = "ショート" | "トール" | "グランデ" | "ベンティ";
// 温度
type Temperature = "ホット" | "アイス";
// ミルク
type Milk = "低脂肪乳" | "無脂肪乳" | "豆乳" | "アーモンドミルク" | "オーツミルク" | "ブレベミルク";
// ホイップクリーム
type WhippedCream = "ノンホイップ" | "ホイップクリーム多め" | "ホイップクリーム少なめ" | "ホイップクリーム追加";
// エスプレッソショット
type EspressoShot = "エスプレッソショット追加";
// シロップ
type Syrup = "バニラフレーバーシロップ追加" | "キャラメルフレーバーシロップ追加" | "ホワイトモカフレーバーシロップ追加";
// シトラス
type Citrus = "シトラス果肉追加";
// ソース
type Sauce = "チョコレートソース追加" | "キャラメルソース追加" | "ハチミツソース追加";
// チョコチップ
type ChocolateChip = "チョコチップ追加";
// ドリンク名(例)
type RegularDrink = "ドリップコーヒー" | "カフェラテ" | "カプチーノ" | "カフェモカ";
type HotDrink = "ホットココア" | "スチームミルク" | "ほうじ茶ラテ";
type IcedDrink = "アイスコーヒー" | "コールドブリュー";
type FrappuccinoDrink = "キャラメルフラペチーノ" | "抹茶クリームフラペチーノ" | "バニラクリームフラペチーノ";
// オプション部分(空文字または各カスタマイズ)
type OptionalMilk = "" | Milk;
type OptionalWhippedCream = "" | WhippedCream;
type OptionalEspressoShot = "" | EspressoShot;
type OptionalSyrup = "" | Syrup;
type OptionalCitrus = "" | Citrus;
type OptionalSauce = "" | Sauce;
type OptionalChocolateChip = "" | ChocolateChip;
// 共通カスタマイズ文字列
type CommonCustomizationString =
`${OptionalMilk}${OptionalWhippedCream}${OptionalEspressoShot}${OptionalSyrup}${OptionalCitrus}${OptionalSauce}`;
// フラペチーノカスタマイズ文字列
type FrappuccinoCustomizationString =
`${CommonCustomizationString}${OptionalChocolateChip}`;
// 各注文タイプ
type RegularOrderString = `${RegularDrink}${Size}${Temperature}${CommonCustomizationString}`;
type HotDrinkOrderString = `${HotDrink}${Size}${CommonCustomizationString}`;
type IcedDrinkOrderString = `${IcedDrink}${Size}${CommonCustomizationString}`;
type FrappuccinoOrderString = `${FrappuccinoDrink}${Size}${FrappuccinoCustomizationString}`;
// 注文全体
type Order =
| RegularOrderString
| HotDrinkOrderString
| IcedDrinkOrderString
| FrappuccinoOrderString;
これで、以下のようにVSCodeに書くと、
const orders: Order[] = [
"カフェラテトールホット",
"ホットココア",
"カフェラテグランデアイス豆乳",
"カフェモカベンティホット低脂肪乳ホイップクリーム多め",
"ほうじ茶ラテベンティホット",
"アイスコーヒートールヤサイマシマシニンニクマシ",
"キャラメルフラペチーノトールチョコチップ追加",
"カフェラテグランデアイスアーモンドミルクノンホイップエスプレッソショット追加バニラフレーバーシロップ追加",
"味噌汁グランデアイスアーモンドミルクノンホイップエスプレッソショット追加バニラフレーバーシロップ追加",
"抹茶クリームフラペチーノグランデオーツミルクノンホイップチョコチップ追加",
];
できない注文には型エラーが出ます。
