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(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,所以无法在编译时推断出具体类型 // // 这是 fromJSONSchema 的限制 - JSON Schema 转换会丢失 TypeScript 类型信息 // schema2.parse({ // name: "John Doe", // age: 30, // 添加必需的 age 字段 // email: "", // }) // type Schema2Type = z.infer; // // Schema2Type 被推断为 any // // 对比:原始 schema 的类型推断是正常的 // type OriginalSchemaType = z.infer; // // 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 是可选的 // }