zod 日期类型如何接受 ISO 日期字符串?

gro*_*190 17 date node.js typescript zod

使用 zod 定义模式时,如何使用日期类型?

如果我使用z.date()(见下文),日期对象将序列化为 ISO 日期字符串。但如果我尝试用 zod 解析它,验证器就会失败,因为字符串不是日期。

import { z } from "zod"

const someTypeSchema = z.object({
    t: z.date(),
})
type SomeType = z.infer<typeof someTypeSchema>

function main() {
    const obj1: SomeType = {
        t: new Date(),
    }
    const stringified = JSON.stringify(obj1)
    console.log(stringified)
    const parsed = JSON.parse(stringified)
    const validated = someTypeSchema.parse(parsed) // <- Throws error! "Expected date, received string"
    console.log(validated.t)
}
main()
Run Code Online (Sandbox Code Playgroud)

小智 21

我从自述文件中使用了这个,它从 v3.20 开始工作https://github.com/colinhacks/zod#dates

在你的代码片段中它会变成这样:

import { z } from "zod"

const someTypeSchema = z.object({
    t: z.coerce.date(),
})
type SomeType = z.infer<typeof someTypeSchema>
Run Code Online (Sandbox Code Playgroud)


gro*_*190 5

发现我可以接受属性的字符串,并在解析期间transform将其转换为Date

import { z } from "zod"

const someTypeSchema = z.object({
    t: z.string().transform((str) => new Date(str)),
})
type SomeType = z.infer<typeof someTypeSchema>

function main() {
    const obj1: SomeType = {
        t: new Date(),
    }
    const stringified = JSON.stringify(obj1)
    console.log(stringified) // <-- {"t":"2023-09-07T07:19:51.128Z"}
    const parsed = JSON.parse(stringified)
    const validated = someTypeSchema.parse(parsed)
    console.log(validated.t instanceof Date) // <-- "true"
}
main()
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用“z.string().pipe(z.coerce.date())”对从字符串到日期的“coerce”执行相同的操作 (3认同)