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