[TIL] Zod - superRefine, z.NEVER

👉🏼 KIM·2024년 12월 4일

TIL

목록 보기
52/55

오늘 공부한것 & 기억하고 싶은 내용

.superRefine

ctx.addIssue를 통해 원하는 만큼 이슈를 추가할 수 있다.
함수 실행 중에 ctx.addIssue가 호출되지 않으면 유효성 검사가 통과

fatal: true 설정 시, 그 다음 refine이 실행되는 것을 방지
z.NEVER 설정 시, 반환 값 자체를 사용하기 위해서가 아닌, 타입 시스템을 맞추기 위함
(함수가 특정한 타입 검사를 통과시키면서도, 그 결과 값을 반환할 필요가 없을 때 사용)
https://zod.dev/?id=superrefine

import { z } from "zod";

const schema = z.object({
  password: z.string(),
  confirmPassword: z.string(),
}).superRefine(({ password, confirmPassword }, ctx) => {
  if (password !== confirmPassword) {
    ctx.addIssue({
      code: z.ZodIssueCode.custom,
      message: "Passwords do not match",
      fatal: true, // 추가 검사 중단
    });
  }
});

schema.parse({
  password: "12345",
  confirmPassword: "123",
}); // 에러: "Passwords do not match"

z.NEVER

  • 기본적으로 어떤 값도 통과시키지 않음 → "절대 유효하지 않음"을 명시.
  • 타입 시스템에서 특정 값이나 조건을 명시적으로 차단하려는 경우 사용.
  • 기본적으로 모든 입력을 거부하는 스키마
  • API 스키마에서 특정 필드의 사용을 차단
  • 타입 유효성 검사에서 never 타입을 활용하여 실수를 방지.
import { z } from "zod";

// 특정 필드 차단
const userSchema = z.object({
  id: z.string(),
  role: z.enum(["admin", "user"]),
  extra: z.NEVER, // 이 필드는 절대 허용되지 않음
});

userSchema.parse({
  id: "123",
  role: "admin",
  extra: "unexpected_field", // 에러 발생: 'extra' 필드는 허용되지 않음
});

// 타입만 검사 (값을 반환하지 않음)
const neverSchema = z.NEVER;
const result = neverSchema.safeParse("anything"); // 항상 실패

배운점 & 느낀점

Zod를 배워서 유효성검사 하는 법을 배웠는데, 이 개념들은 좀 심화과정인거 같다. 커스텀 유효성 검사와 타입 안정성을 높이는데 중요한 개념인거 같아서 나중에 타입스크립트도 함께 더 작업을 하게 된다면 꼭 사용해야 할 필수 개념같다.
지금은 아직 초보 이슈로... 더 공부하는걸로~

profile
프론트는 순항중 ¿¿

0개의 댓글