Skip to content
On this page

Zod

官网 - Repo

TOC

动机

zod 是一个工具库,有一些特性:

  • 在运行时校验数据结构
  • 转换数据结构
  • ...

例如常规情况下的一个数据结构

ts
interface User {
  username: string
}

在使用中,例如从后端拿到的数据结构:

ts
function buildUser(from: any) {
  return { ...from } as User
}

由于 TS 只存在于编译期,那么实际上在运行期,这样的代码是不安全的。

所以就可以

ts
const userSchema = z.object({
  username: z.string()
})

function buildUser(from: any) {
  // 假设 from 无法满足 userSchema 的要求,则这里会报错,在开发阶段就能发现问题
  return userSchema.parse(from)
}

基础用法

1. 基础类型

Zod 支持以下几种基础类型

ts
import { z } from 'zod'

// primitive values
z.string()
z.number()
z.bigint()
z.boolean()
z.date()
z.symbol()

// empty types
z.undefined()
z.null()
z.void() // accepts undefined

// catch-all types
// allows any value
z.any()
z.unknown()

// never type
// allows no values
z.never()

2. Zod 转 TS

可以使用 z.infer 来获取 Zod 的类型

ts
const A = z.string()
type A = z.infer<typeof A> // string

const u: A = 12 // TypeError
const u: A = 'asdf' // compiles