WORKING…
Zod 是 Typescript 的运行时校验库,学习其以方便类型检查,对代码的优雅以及减少样板代码是比较重要的,何况其除类型检查外还有一些更强的约束,对业务代码开发有利。
Zod 最佳的学习文档就是其官方文档,这里的笔记主要是参照 官方文档,但聚焦最常用的部分。
Zod 就同其他的一些类型校验库一样,通过值而非类型的形式去定义类型(且提供从这种类型定义中获取编译期类型的手段),从而将类型信息能够留到运行时以用于校验,学习的重点在于如何将 typescript 的类型定义转换成 Zod 的值定义。
简单使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import {z, ZodError} from 'zod'
z.string(); z.number(); z.bigint(); z.boolean(); z.date();
z.undefined(); z.null(); z.void();
z.any(); z.unknown();
z.never();
const StringType = z.string()
type StringType = z.infer<typeof StringType>
const str : StringType = StringType.parse("hello") const strErr : StringType = StringType.parse(12)
const maybeRes = StringType.safeParse(12) if (maybeRes.success) { const result : StringType = maybeRes.data } else { const error : ZodError<string> = maybeRes.error }
|
组合类型
仅有字面量是无法用在业务上的,各种业务模型需要简单类型的组合去描述。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| const NumberArr = z.array(z.number())
const NumberArr1 = z.number().array() const StringNumberPair = z.tuple([z.string(), z.number()])
const User = z.object({ name: z.string(), age: z.number() })
const UnionType = z.object({}).and(z.number())
const NumberRecord = z.record(z.number(), z.string())
const SumType = z.object({ success: z.literal(true), code: z.number() }).or(z.object({ success: z.literal(false), error: z.string() }))
const ABC = z.object({ username: z.string(), age: z.string().optional(), clazz: z.string().nullable() }) type ABC = z.infer<typeof ABC>
const DB = z.object({ name: z.string(), users: z.array(User) }) type DB = z.infer<typeof DB>
const Father = z.object({ prop1: z.string(), prop2: z.number() })
const Son0 = z.object({ ...Father.shape, prop3: z.string() })
const Son1 = Father.extend({ prop3: z.string() }) const Son2 = Father.merge(z.object({ prop3: z.string() }))
|
业务校验,自定义校验
对于 string,number 等类型,Zod 提供了除类型之外的其它校验。
| const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]); type Literal = z.infer<typeof literalSchema>; type Json = Literal | { [key: string]: Json } | Json[]; const jsonSchema: z.ZodType<Json> = z.lazy(() => z.union([literalSchema, z.array(jsonSchema), z.record(jsonSchema)]) )
|
常用类型操作符,Promise
TODO
函数,泛型
泛型类型接受类型参数变成实际类型,这本来是在编译期完成的,使用 Zod 时,这个操作通过函数定义和调用去完成。
TODO