TypeScript与JSON Schema互转及IntelliJ代码补全问题咨询
TypeScript+OpenAI函数调用:解决类型重复与代码补全问题
一、json-schema-to-ts的FromSchema无代码补全?排查这几个点
- 必须给JSON Schema加
as const断言:json-schema-to-ts依赖TypeScript的字面量类型推导,如果Schema定义后不加as const,TS无法识别具体的结构细节,自然不会有代码补全。正确示例:import { FromSchema } from 'json-schema-to-ts'; const UserResponseSchema = { type: 'object', properties: { name: { type: 'string' }, age: { type: 'number' } }, required: ['name'] } as const; // 关键:固定Schema的字面量类型 type UserResponse = FromSchema<typeof UserResponseSchema>; - 检查IntelliJ配置:确保开启了TypeScript服务(
Settings → Languages & Frameworks → TypeScript中勾选Enable TypeScript service),同时确认json-schema-to-ts已正确安装(库自带类型定义,无需额外安装@types包)。 - 避免动态生成Schema:如果Schema里包含变量引用或动态计算的值,FromSchema无法正确推导类型,尽量用静态字面量定义所有结构。
二、从TypeScript接口/类生成JSON Schema并转回类型
完全可行,推荐两种方案:
方案1:用typescript-json-schema直接生成Schema
这个工具能把TS接口/类编译成标准JSON Schema,支持运行时动态生成:
- 安装依赖:
npm install typescript-json-schema --save-dev - 定义TS接口:
// src/types.ts export interface OrderResponse { orderId: string; total: number; items: Array<{ name: string; quantity: number }>; } - 运行时生成Schema:
import * as TJS from 'typescript-json-schema'; // 初始化TS程序 const compilerOptions: TJS.CompilerOptions = { strict: true }; const program = TJS.getProgramFromFiles(['src/types.ts'], compilerOptions); // 生成对应接口的JSON Schema const orderSchema = TJS.generateSchema(program, 'OrderResponse', { required: true }); // 将orderSchema传给OpenAI函数调用的parameters参数
方案2:用Zod实现类型、校验、Schema三位一体
Zod是类型安全的校验库,既能生成TS类型,也能转成JSON Schema,避免重复定义:
- 安装依赖:
npm install zod zod-to-json-schema --save - 定义Zod Schema并推导TS类型:
import { z } from 'zod'; import { zodToJsonSchema } from 'zod-to-json-schema'; const OrderZodSchema = z.object({ orderId: z.string(), total: z.number(), items: z.array(z.object({ name: z.string(), quantity: z.number() })) }); // 从Zod Schema推导TS接口 type OrderResponse = z.infer<typeof OrderZodSchema>; // 转成JSON Schema传给OpenAI const orderJsonSchema = zodToJsonSchema(OrderZodSchema); - 校验OpenAI响应并转为TS类型:
const rawResponse = await openai.chat.completions.create({ // 配置模型、messages、functions等,其中functions的parameters用orderJsonSchema }); const rawData = JSON.parse(rawResponse.choices[0].message.function_call?.arguments || '{}'); // 校验并转换,自动获得OrderResponse类型 const orderData = OrderZodSchema.parse(rawData);
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

