Files
query/test/schema.ts

57 lines
2.0 KiB
TypeScript

import z from "zod";
import { toJSONSchema, fromJSONSchema } from './test-schema.ts'
const schema = z.object({
name: z.string().describe("The name of the person"),
age: z.number().int().min(0).describe("The age of the person"),
email: z.string().optional().describe("The email address of the person"),
})
const nameSchema = { name: z.string().optional().describe("The name of the person") }
// console.log("JSON Schema for the person object:");
// console.log(
// JSON.stringify(toJSONSchema(nameSchema), null, 2)
// );
console.log("\n--- 自定义 override ---");
const jsonSchema = toJSONSchema(nameSchema)
console.log(
JSON.stringify(jsonSchema, null, 2)
);
// console.log('shape', schema.shape);
// console.log('shape name', schema.shape.name.toJSONSchema());
// const jsonSchema = toJSONSchema(schema);
let schema2 = fromJSONSchema<false>(jsonSchema);
console.log("\n--- 从 JSON Schema 反向转换回 Zod schema ---");
console.log('schema2 nameSchema', schema2.name.safeParse("John Doe"));
// console.log('schema2', schema2.safeParse({ name: "John Doe", }));
// console.log('schema2 email', schema2.email.safeParse(undefined));
// console.log('schema2 age', schema2.age.safeParse(1));
// // schema2 的类型是 ZodSchema<any>,所以无法在编译时推断出具体类型
// // 这是 fromJSONSchema 的限制 - JSON Schema 转换会丢失 TypeScript 类型信息
// schema2.parse({
// name: "John Doe",
// age: 30, // 添加必需的 age 字段
// email: "",
// })
// type Schema2Type = z.infer<typeof schema2>;
// // Schema2Type 被推断为 any
// // 对比:原始 schema 的类型推断是正常的
// type OriginalSchemaType = z.infer<typeof schema>;
// // OriginalSchemaType = { name: string; age: number; email?: string | undefined }
// const v: Schema2Type = {
// name: "John Doe",
// email: ""
// }
// // 如果使用原始 schema,类型推断会正常工作:
// const v2: OriginalSchemaType = {
// name: "John Doe",
// age: 30,
// // email 是可选的
// }