Zenn
Open3

プチソースレビュー:微妙に簡単な値の変換はZodのスキーマでやろう

meijinmeijin

Before

こういう関数のソースレビューをしました

  const parseSearchParameter = (searchParameters: string[] | undefined): string | undefined => {
    if (!searchParameters || searchParameters.length !== 1) {
      return undefined;
    }

    const [value] = searchParameters;

    // 'hoge' or 'fuga' ならそれを返す、その他は undefined
    return value === 'hoge' || value === 'fuga' ? value : undefined;
  };

これは、フロントエンドとバックエンドで受け取る値の型変換の都合で、配列を単一の値に変換する必要が生じたときの関数です。
要は、['hoge']か、['fuga']しかうけつけず、[]や、['hoge', 'fuga]はundefinedとみなすみたいな変換処理です。

meijinmeijin

After

hogeとfugaのいずれかが1つだけ含まれる場合のみValidとみなすSchemaを定義して、safeParseします。

  const searchParameterSchema = z.array(z.union([z.literal('hoge'), z.literal('fuga')])).length(1);
  const parseResult = desiredTeachingPeriodSchema.safeParse(searchParameters);
  const parsedSearchParameter = parseResult.success ? parseResult.data[0] : undefined
meijinmeijin

Pros

  • 手続き的な処理を読まなくても宣言的にどういう値がいいかわかる
  • そもそもやろうとしていることに対してコードの行数が多すぎたので、スリムになってGood

Cons

  • safeParse後の値の型について知っておくほうが驚きが小さくなる
  • safeParse自体がそもそもdata相当のものを返してくれる方がいい or 要素1つ目を返すところまでSchemaで定義できたほうが読みやすい ※Zod力もっと高めれば書けるかもだけどコスパが合わないかな
  • ZodのSchemaは普通rhfで使うのでちょっと驚きがある
ログインするとコメントできます