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