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