众所周知,Typescript 解决的是编码时的类型安全问题。但是对于运行时是没有解决的。而 Zod 是针对于Runtime的。
Zod的使用
Zod basic usage
primitives (string, number, boolean, undefind)
1 2 3
| import {z} from "Zod"; const stringParser = z.string(); stringParser.parse(123)
|
objects
create a object schema
1 2 3 4 5 6 7
| import {z} from "Zod"; const PersonSchema = z.object({name: z.string()});
const getNameByData = (data) => { const parsedData = PersonSchema.parse(data); return parsedData.name; }
|
create a array schema
1 2 3 4 5 6 7 8
| import {z} from "Zod"; const PersonSchema = z.object({name: z.string()}); const PersonListSchema = z.array(PersonSchema);
const getNameByDataList = (list) => { const parsedList = PersonSchema.parse(list); return parsedList[0].name; }
|
translate a typescript type from Zod
1 2 3
| import {z} from "Zod"; type PersonListType = z.infer(PersonListSchema);
|
other Type
Zod 通过组合各种function的方式,实现了联合类型。
union types
1 2 3 4 5
| const Form = z.object({ repoName: z.string(), privacyLevel: z.union([z.literal("private"), z.literal("public")]), });
|
1 2
| const stringOrNumber = z.union([z.string(), z.number()]);
|
optional
1 2 3 4 5 6
| const Form = z.object({ name: z.string(), phoneNumber: z.string().optional(), email: z.string(), website: z.string().optional(), });
|
Key
表单验证
做了运行时的Type 校验,表单验证感觉也是顺手为止。Zod 通过函数的方式接入了表单校验。
1 2 3 4 5 6 7 8
| import { z } from 'zod';
const Form = z.object({ name: z.string(), phoneNumber: z.string().min(5).max(20).optional(), email: z.string().email(), website: z.string().url().optional(), });
|
还有很多扩展的方法,具体可以参考文档。