在TypeScript项目中,类型系统能在编译阶段帮我们规避很多错误,但有些场景下我们需要把TypeScript的推断类型转换成JSON模式,比如做接口参数校验、生成API文档或者实现前后端数据格式统一。下面我们就来看看具体的实现方法。

什么是TypeScript推断类型
TypeScript的推断类型是指编译器根据代码上下文自动推导出来的类型,不需要开发者显式声明。比如下面的代码,变量user的类型会被自动推断为包含name和age两个属性的对象类型:
// 这里TypeScript会自动推断user的类型为 { name: string; age: number }
const user = {
name: "张三",
age: 20
};
JSON模式的基本结构
JSON模式是用来描述JSON数据结构的规范,常见的字段包括type表示数据类型,properties表示对象属性,required表示必填字段等。比如上面user对应的JSON模式大概是这样的:
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "number" }
},
"required": ["name", "age"]
}
手动转换的核心逻辑
手动转换需要我们先获取TypeScript的推断类型,再按照JSON模式的规则映射对应的字段。核心步骤分为三步:
- 提取TypeScript类型的结构信息,包括类型名称、属性列表、属性类型、是否必填等
- 建立TypeScript类型和JSON模式类型的映射关系,比如
string对应"string",number对应"number" - 按照JSON模式的语法规则拼接生成最终的JSON模式字符串
类型映射关系参考
下面是常见的TypeScript基础类型和JSON模式类型的对应关系:
| TypeScript类型 | JSON模式type值 |
|---|---|
| string | string |
| number | number |
| boolean | boolean |
| null | null |
| 数组类型 T[] | array,同时需要items字段描述元素类型 |
| 联合类型 A | B | 使用any或者枚举值描述 |
手动转换代码示例
下面是一个简单的手动转换函数,处理基础的对象类型:
// 定义TypeScript推断类型
type User = {
name: string;
age: number;
email?: string; // 可选属性
};
// 手动转换函数
function convertTypeToJsonSchema<T>(): Record<string, any> {
// 这里实际场景中需要通过TypeScript编译器API获取类型信息,这里简化为模拟逻辑
const schema: Record<string, any> = {
type: "object",
properties: {
name: { type: "string" },
age: { type: "number" },
email: { type: "string" }
},
required: ["name", "age"] // 可选属性不包含在required中
};
return schema;
}
// 调用函数获取JSON模式
const userSchema = convertTypeToJsonSchema<User>();
console.log(JSON.stringify(userSchema, null, 2));
使用自动化工具转换
手动转换只适合简单的类型,复杂的嵌套类型、泛型、联合类型等手动处理会很麻烦,这时候可以使用成熟的自动化工具。目前最常用的工具是typescript-json-schema,它可以直接读取TypeScript类型定义生成对应的JSON模式。
工具安装
首先通过npm安装工具:
npm install typescript-json-schema --save-dev
工具使用示例
假设我们有一个types.ts文件,里面定义了需要转换的类型:
// types.ts 文件内容
export type Product = {
id: number;
title: string;
price: number;
tags: string[];
isOnSale: boolean;
};
然后编写转换脚本generate-schema.ts:
import { resolve } from "path";
import { generateJsonSchema } from "typescript-json-schema";
// 设置编译器选项
const compilerOptions = {
strict: true,
esModuleInterop: true
};
// 生成JSON模式
const schema = generateJsonSchema(
[resolve(__dirname, "./types.ts")], // 类型文件路径
"Product", // 要转换的类型名称
compilerOptions
);
// 输出结果
console.log(JSON.stringify(schema, null, 2));
运行脚本后就能得到完整的JSON模式,包含数组、布尔值等复杂类型的正确描述。
注意事项
- TypeScript的一些高级类型比如条件类型、映射类型,转换时可能需要额外配置工具参数才能正确识别
- JSON模式本身有不同的版本规范,生成时要注意指定符合项目要求的版本
- 如果类型中包含循环引用,转换时需要做特殊处理,避免生成无限嵌套的JSON模式
转换过程中如果遇到类型无法正确映射的情况,可以先简化类型结构,再逐步适配复杂的类型定义。
TypeScriptJSON模式类型推断类型转换修改时间:2026-07-05 11:09:26