TypeScriptでDDDのValue Objectを実装したい。
1. 抽象クラスの実装
- symbolを利用して等価性を持たせる
- コンストラクタ内で抽象メソッド
isValid
を呼び、初期化時点でその値オブジェクトの値がルールに沿っているかを判定
2. 値オブジェクトの実装
先ほどの抽象クラスを継承し、例としてUUID用の値オブジェクトを実装してみた。
3. 値オブジェクトの利用
余談
zodで使う場合
TypeORMで使う場合
TypeORMのエンティティクラスで値オブジェクトの型を持つカラムを定義したい場合。
@Column
デコレーターのtransformer
オプションで実現できるので、それに指定するオブジェクトを共通化すべくValueObjectTransformer
関数を実装。
あとは対象カラムのtransformer
に指定すればOK。これでSQLクエリの実行前後で素の値←→値オブジェクトの変換が行われる。
class-validatorで使う場合
NestJSにおけるDTOクラスなどでありがちな、リクエストとして受け取ったプリミティブ値を値オブジェクトに変換したい場合。
対象のプロパティに@Transform
デコレータを付与することで実現できる。
また今回のUuidクラスのようにドメインルールの判定をコンストラクタ内で行っている場合、class-validatorによるバリデーションは必要ないので@Allow
デコレータを付与する。
12