型ヘルパーデコレータ
型ヘルパーは、バリデーションが実行される前に フィールドの値をどう解釈するか をバインダーに伝えます。ネストされたオブジェクトがどのクラスになるか、配列の各要素がどの型に変換されるか、生の文字列がどの enum メンバーに対応するかを決めます。
@Type、@List、@Enum は 1 つのカテゴリを形成します。1 つのフィールドに適用できるのはこのうち最大 1 つです。
@Type(typeFn: TypeThunk | TypeResolver, options?: TypeOptions)
プレーンな JSON オブジェクトを対象クラスのインスタンスに変換します。
typeFn: 対象クラスを返す関数。固定の型にはサンク() => Classを、生データからクラスを選ぶ場合はリゾルバ(data) => Classを使います。options.discriminator(オプション):{ property, subTypes: [{ name, value }] }の形式の構造的マッピング。propertyの値によってクラスが選ばれます。
@Type は String・Number・Boolean のフィールドには適用できません。
class User {
@Body()
@Type(() => Profile)
profile!: Profile
}
ネストマッピング、循環参照、動的解決については 型変換と多態性 を参照してください。
@List(elementType: ArrayElementType)
配列フィールドの要素型を宣言し、各要素を個別に変換します。
elementType:String、Number、Boolean、Date、クラスコンストラクタ、または文字列リテラル'string'、'number'、'boolean'、'date'のいずれか。
@List は配列フィールドにのみ適用できます。
class ListSample {
@Body()
@List(Number)
scores!: number[]
}
完全な例は List デコレータ を参照してください。
@Enum(enumObj: object, message?: string)
入力値を enumObj のメンバーにマッピングし、メンバーでない値は拒否します。
enumObj: マッピング先の enum オブジェクト。message(オプション): 値がメンバーでないときに表示するエラーメッセージ。省略すると、デフォルトメッセージが使用されます。
enum のキー('ADMIN')と値('admin'、0)のどちらも入力として受け付けられ、バインドされたフィールドには常に enum の値が入ります。数値文字列は数値として比較されるため、'0' は値が 0 のメンバーに一致します。
enum UserRole {
ADMIN = 'admin',
USER = 'user',
}
class UpdateRoleRequest {
@Body('role')
@Enum(UserRole)
role!: UserRole
}
@Enum は値の変換と検査の両方を行いますが、バリデーションデコレータ ではなく 型ヘルパー です。ここから 2 つの帰結が生まれます。
@Eachが包めるのはバリデーションデコレータだけなので、@Each(Enum(UserRole))は拒否されます。@Enumは独自のトランスフォーマーをインストールするため、@Transformとは併用できません。
スキーマルール
bindingCargo() は以下のルールを、最初のリクエスト時ではなくルート登録時に検査します。違反があれば起動時に CargoSchemaError を投げます。
| ルール | 違反メッセージ |
|---|---|
| 1 つのフィールドに型ヘルパーは 1 つだけ | @List + @Type cannot be combined; apply a single one of @Type/@List/@Enum |
@List は配列フィールドが必要 | @List can only be applied to array fields |
@Type はプリミティブフィールドを拒否 | @Type cannot be applied to a primitive field |
@Each は型ヘルパーを包めない | @Each cannot wrap type-helper decorator(s): @Enum |
トランスフォーマーは @Enum が持つ | @Enum cannot be combined with @Transform; @Enum installs its own transformer |
メッセージには実際に適用したデコレータが評価順(下から上)に並ぶため、先頭部分は書いたコードによって変わります。