类型(下)
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