NestJSからHono + Zodへ移行。DTOの値加工をschemaとhelperで再現した
DRANK
NestJSからHono + Zodへrouteを移植したとき、DTOの型をZod schemaへ書き換えるだけでは入力値の意味を維持できませんでした。移行元では、class-transformerの@Transform()が文字列から数値への変換、default値の適用、空文字の正規化だけでなく、boolean化、文字列のtrim、単一値の配列化なども担っていました。これらはTypeScriptの型にもclass-validatorの制約にも現れません。そこで、NestJS DTOに書かれていた値変換をfield単位で確認し、Zod schemaへ移植しました。そのうち複数projectで繰り返す数値変換だけを、Zod helperとして@rdlabo/workers-hono-kitへ切り出しています。この記事では、入力値がZod schemaを通ってどの値になるかに焦点を当てます。移植するのは型ではなく値変換TypeScriptの型、validation、値変換はそれぞれ別の役割です。type Query = { page: number; }; このnumberはcompile時の情報です。URLが?page=2なら、path parameterやquery parameterとして受け取る値は文字列の"2"です。Honoの公式例でも、文字列として届くquery valueをnumberにする場合はvalidatorでcoerceしています。 class ListQuery { @Transform(toNumber) @IsInt()…