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



在使用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()

我从README中使用了这个,它从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>

发现我可以接受属性的字符串,并在解析期间使用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()

你必须期待一个字符串而不是

const someTypeSchema = z.object({
t: z.string().refine((arg) =>
arg.match(
/^(d{4})-(d{2})-(d{2})T(d{2}):(d{2}):(d{2}(?:.d*)?)((-(d{2}):(d{2})|Z)?)$/
))
})

以上答案对我不起作用,

然而,正如Zod文档中建议的那样,这个问题可以通过对^zod 3.20版本使用强制来解决,如下所示

date: z.coerce.date();

和版本小于zod 3.20,下面的工作对我来说是建议在这个问题

date: z.string().pipe(z.coerce.date())

相关内容

  • 没有找到相关文章

最新更新