Value Objectの代わりにBranded Typesを使う
[typescript]
[zod]
[branded types]
[value object]
プリミティブ型にドメイン知識を足すにはValue Objectを使えばよいのですが、なるべくclassは書きたくありません。
そこでBranded Typesを使います。
Branded Typesとは
次のようにプリミティブを拡張するユーティリティタイプを作り、新しい型を定義します。
brandは焼き印のことです。
上記の例ではキーを文字列にしましたが、文字列の代わりにunique symbolを使うことで、 Bに同じ文字列が入っても別の型として定義できます。
多人数で開発しているときはこちらのほうがおすすめです。
💡 unique symbol https://www.typescriptlang.org/docs/handbook/symbols.html#unique-symbol
便利な使いかた
IDに任意の文字列が入るのを防ぐ
貨幣計算で別の貨幣が混ざるのを防ぐ
zodを使ったブランド化とバリデーション
上記のように自分で Branded
を定義して使う他に、バリデーションライブラリの zod でも同じことができます。
zodを使うメリットは、型定義とバリデーションを一度に行えることです。 また、型アサーションも必要ないので、JSONをそのままパースすることができます。
まとめ
ドメイン知識の型表現でご安全に。