You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,支持运行时动态生成:

  1. 安装依赖:
    npm install typescript-json-schema --save-dev
    
  2. 定义TS接口:
    // src/types.ts
    export interface OrderResponse {
      orderId: string;
      total: number;
      items: Array<{ name: string; quantity: number }>;
    }
    
  3. 运行时生成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,避免重复定义:

  1. 安装依赖:
    npm install zod zod-to-json-schema --save
    
  2. 定义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);
    
  3. 校验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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:42:57