状況
個人開発のアプリで、新規アカウントの登録処理で使うDTOを定義したところ
フィールド名に赤線エラーが表示された
※TypeScriptはStrictモードをtrueにした状態
エラーメッセージ
プロパティ 'name' に初期化子がなく、コンストラクターで明確に割り当てられていません。
ts(2564) (property) CreateOrganizationDto.name: string
該当コード
export class CreateOrganizationDto {
@IsString()
@IsNotEmpty()
name: string;
}
原因
TypeScriptのコンパイラがこのプロパティはあとで必ず初期化されると認識できていないため(コンストラクタで初期化を明示しておらず、Undefinedになる可能性があるため)
対策
必須項目には!(確実な代入アサーション)を、任意入力の項目には?(オプショナルプロパティ)をつける
NestJSではValidationPipeやclass-transformerによってリクエストからバリデーションされた値がDTOに入る。
つまり、コンストラクタでは初期化されないが実行時には必ず値が入るのをTypeScript側に伝える必要がある
改善後のコード
export class CreateOrganizationDto {
@IsString()
@IsNotEmpty()
name!: string;
}