0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TypeScriptで有効なスタバの注文を静的に検証する

Posted at

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[] = [
  "カフェラテトールホット",
  "ホットココア",
  "カフェラテグランデアイス豆乳",
  "カフェモカベンティホット低脂肪乳ホイップクリーム多め",
  "ほうじ茶ラテベンティホット",
  "アイスコーヒートールヤサイマシマシニンニクマシ",
  "キャラメルフラペチーノトールチョコチップ追加",
  "カフェラテグランデアイスアーモンドミルクノンホイップエスプレッソショット追加バニラフレーバーシロップ追加",
  "味噌汁グランデアイスアーモンドミルクノンホイップエスプレッソショット追加バニラフレーバーシロップ追加",
  "抹茶クリームフラペチーノグランデオーツミルクノンホイップチョコチップ追加",
];

できない注文には型エラーが出ます。

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?