Skip to content

类型(下)

default

纯粹默认值

对象

数组

ts
const stringArray = z.array(z.string()); // 或 z.string().array()
ts
z.string().array().length(5);

元组

联合类型

todo

先放弃很多类型,以后在补

instanceof 验证

ts
class Test {
  name: string;
}

const TestSchema = z.instanceof(Test);

TestSchema.parse(new Test()); // ✅
TestSchema.parse("whatever"); // ❌

refine

ts
 z.string().refine((val) => val.length > 8, {
    error: "Too short!",
  }),

refine 只用于验证,不要 throw error。error 在 后面定义!

abort

ts
z.string()
  .refine((val) => val.length > 8, { error: "Too short!" })
  .refine((val) => val === val.toLowerCase(), {
    error: "Must be lowercase",
    abort: true,
  });

自定义 path

ts
 z.string().refine((val) => val.length > 8, {
    error: "Too short!",
    path: ["confirm"], // 错误路径
  }),

async

refine 是可以 async 的

ts
z.string().refine(async (id) => {
  // 验证 ID 是否存在数据库
  return true;
});

check

refine 是 check 的语法糖

ts
const UniqueStringArray = z.array(z.string()).check((ctx) => {
  if (ctx.value.length > 3) {
    ctx.issues.push({
      code: "too_big",
      maximum: 3,
      origin: "array",
      inclusive: true,
      message: "Too many items 😡",
      input: ctx.value,
    });
  }

  if (ctx.value.length !== new Set(ctx.value).size) {
    ctx.issues.push({
      code: "custom",
      message: `No duplicates allowed.`,
      input: ctx.value,
      continue: true, // 使此问题可继续(默认:false)
    });
  }
});

transform

transform 不验证输入,而是对数据进行转换

ts
const castToString = z.transform((val) => String(val));

castToString.parse(123); // => "123"

pipe

pipe 与 transform 都是浅尝辄止,回头 todo

todo

依旧很多 todo