json-schema-content-mapper
TypeScript 9.1的JSONSchema内容映射器。
一个本地 TypeScript 7.1+内容映射器 动态编译的插件
*.jsonschema 将文件动态地转换为全类型TypeScript源
schema2dts。
不需要构建步骤生成器或通用通配符环境声明。你的 JSON模式被视为一等类型模块。
特性
- Zero-Disk开销: 生成内存中的虚拟
.ts定义文件 直接由tsc。 - json - rpc多路复用: 建在…之上
vscode-jsonrpc要处理得快, 并发的、非阻塞的多项目编译上下文。 - 无缝的引用: 支持使用标准JSON的多文件架构
模式
$ref指针。
安装
将内容映射器作为开发依赖项安装到项目中:
npm install -D json-schema-content-mapper
注意:确保您的工作空间使用 打字稿7.1 (或以后)支持 内容映射器。
配置(tsconfig.json)
在new下注册包 contentMappers 编译器属性。我们
强烈建议使用 .jsonschema 模式定义的扩展
文件。
{
"compilerOptions": {
"module": "preserve",
"moduleResolution": "bundler",
"strict": true
},
"contentMappers": [
{
"package": "json-schema-content-mapper",
"extensions": [".jsonschema"],
"options": {
"exportNamespaces": true
}
}
],
"include": ["src"]
}
多文件架构引用($ref)
这个内容映射器的主要优点之一是它的处理能力
本地多文件结构。而不是将所有内容捆绑到一个
巨大的模式,您可以将定义拆分为多个 .jsonschema 文件
并使用JSON指针引用它们。
当一个模式通过 $ref,内容映射器
动态地将这个链接转换成标准的JavaScript/TypeScript import
语句 .d.ts 输出。然后TypeScript的编译器会处理
自动绘制跨文件依赖关系图。
示例设置
1. 定义共享基模式(src/phone.jsonschema)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Phone",
"type": "string",
"pattern": "+[0-9]+.[0-9]+"
}
2. 在主架构中引用它(src/user.jsonschema)
中使用相对文件路径 $ref 属性:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "User",
"type": "object",
"properties": {
"name": { "type": "string" },
"email": { "type": "string" },
"phone": { "$ref": "./common.jsonschema" }
},
"required": ["name"]
}
3. 在TypeScript代码中自然地使用(src/index.ts)
TypeScript解析整个链。的生成类型 User 将
自动继承字段(phone) phone.jsonschema
通过TypeScript的交集类型:
import { User } from './user.jsonschema';
const user: User = {
name: 'John Doe',
email: '[email protected]',
phone: '+33.16561655616',
};
console.log(user.id); // Available & Typed (string)
console.log(user.name); // Available & Typed (string)
console.log(user.phone); // Available & Typed (string)
运行类型检查
由于内容映射器调用外部代码包来计算模块形状, TypeScript编译器需要一个 明确的安全选择加入标志 运行 从CLI进行类型检查:
npx tsc --runExternalCode --noEmit
没有 --runExternalCode 国旗, tsc 会忽略内容映射器吗
处理,并抛出导入解析错误。
技术架构
这个插件建立了一个异步JSON-RPC 2.0通信进程
管道与 tsc 通过标准输入/输出流(stdin/stdout).
initialize:协商结构格式参数(例如:utf-16字符定位)。openProject:缓存传入tsconfig.json插件配置 一个孤立的projectRegistry链接到不透明工作区的映射projectHandle。transform:提取参数,解析项目上下文选项, 运行generateJSONSchemaTypes(),并交付编译后的虚拟代码 层立即返回到go编译tsc核心引擎。closeProject:清除操作缓存映射到的引用 防止在手表模式期间内存泄漏。