一键导入
zod-v4
Zod v4 coding guidelines and migration reference. ALWAYS read this when using Zod validation library
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Zod v4 coding guidelines and migration reference. ALWAYS read this when using Zod validation library
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | zod-v4 |
| description | Zod v4 coding guidelines and migration reference. ALWAYS read this when using Zod validation library |
Every schema MUST have inferred type above it:
export type User = z.infer<typeof User>
export const User = z.object({...})
Requirements:
/** */), never //String validations are standalone functions:
// WRONG: z.string().email()
// RIGHT: z.email(), z.url(), z.uuid(), z.ip()
Use error param sparingly - Zod's defaults are excellent:
// WRONG: z.email({error: "Invalid email"}) // Redundant!
// RIGHT: z.email() // Zod says "Invalid email"
// RIGHT: Only for business logic:
z.string().refine((val) => /[A-Z]/.test(val), {
error: 'Must contain uppercase',
})
z.number() for general numbersz.int() for integers only (not z.number().int())z.int32(), z.float64() for specific typesz.object() - strips unknowns (default)z.strictObject() - rejects extrasz.looseObject() - allows extrasUse .check() for advanced validation, .refine() for simple validation:
Migration steps:
.superRefine() → .check() for advanced validation with multiple issues.check(): val → ctx.value, ctx.addIssue() → ctx.issues.push()z.ZodIssueCode.custom → 'custom' stringinput: ctx.value to issue object.refine() for simple boolean validation with single errorz.prettifyError() - Human-readable formatz.treeifyError() - Tree structure formatDefine function schemas with input/output types:
z.function({
input: [z.string()],
output: z.number(),
})
z.record(keyType, valueType)
z.iso.datetime() - ISO 8601 datetimez.iso.date() - ISO 8601 date.default() applies to output; use .prefault() for v3 behaviorz.file().min(1024).max(5*1024*1024).mime(['image/jpeg'])z.pipe(z.string(), z.number()) for transformations.check(async (val) => {...}) for async validationz.array(z.email()) or z.email().array().optional(), .nullable(), .nullish()| v3 | v4 |
|---|---|
| z.string().email() | z.email() |
| {message: "err"} | {error: "err"} |
| .strict() | z.strictObject() |
| .format() | z.treeifyError() |
| z.string().datetime() | z.iso.datetime() |
| .args().returns() | {input:[...], output:...} |
| .superRefine() | .check() |
| ctx.addIssue() | ctx.issues.push() |
| z.ZodIssueCode.custom | 'custom' |
import * as z from 'zod'
/** User registration */
export type UserReg = z.infer<typeof UserReg>
export const UserReg = z.object({
email: z.email(),
password: z
.string()
.min(8)
.refine((pwd) => /[A-Z]/.test(pwd) && /\d/.test(pwd), { error: 'Need uppercase & number' }),
age: z.number().min(18),
})
/** Function with input/output types */
export type ProcessUser = z.infer<typeof ProcessUser>
export const ProcessUser = z.function({
input: [UserReg],
output: z.object({
id: z.string(),
createdAt: z.iso.datetime(),
}),
})
Guide for running inline Python scripts with uv. This should be used when the user says "use inline python"
Guide for running inline TypeScript scripts with Bun. This should be used when the user says "use inline typescript"
Git commit guidelines for incremental commits. Read this when user asks you to auto commit as you go