@abapify/ts-xsd

中文文档
0.4.34发布于 2026/11/03MITTypeScriptES Module构建来源已验证近 30 天下载 1.4万

W3C XSD 1. 1 解析器, 构建器, 和 TypeScript 类型推论

中文使用文档
文档目录19 节
  1. 为什么
  2. 安装
  3. 快速启动
  4. 分析并构建 XSD
  5. Schema 文学的推论
  6. 分析并用 Schema 构建 XML
  7. 从 XSD 生成类型脚本接口
  8. API 参考
  9. XSD 模块
  10. 推断模块
  11. XML 模块
  12. 代码模块
  13. 国 际
  14. 基于配置的生成
  15. Schema 结构
  16. 跨计划类型分辨率
  17. 设计原则
  18. 参考资料
  19. 许可证

t-xsd

npm version license

W3C XSD 1. 1 解析器, 构建器, 和 TypeScript 类型推论 —— 1:1 TypeScript 代表 XML Schema 定义.

为什么

在TypeScript中与XSD schemas合作,通常指从真理源来漂移的手持型. ts-xsd 缩小这一差距:

  • 解析 任意 W3C XSD 1.1 计程器为打入 Schema 对象——没有发明属性,没有快捷键.
  • 推断 编译时的脚本类型 InferSchema<T>。 。 。 .
  • 生成 TypeScript 接口在构建时,当计划过于复杂,无法编译时间推论.
  • 往返旅行 XSD → Schema → XSD 和语义保护.
  • 解析/ 构建 XML 文档与计划定义相对应.

安装

npm install @abapify/ts-xsd
# or
pnpm add @abapify/ts-xsd
# or
bun add @abapify/ts-xsd

运行时间依赖 : @xmldom/xmldom (DOM解析). ts-morph 财务报告和审定财务报表 zod 用于代码特性.

快速启动

分析并构建 XSD

import { parseXsd, buildXsd } from '@abapify/ts-xsd';

// Parse XSD to typed Schema object
const schema = parseXsd(`
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="person" type="PersonType"/>
    <xs:complexType name="PersonType">
      <xs:sequence>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="age" type="xs:int" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:schema>
`);

// Build back to XSD
const xsd = buildXsd(schema, { pretty: true });

Schema 文学的推论

import type { InferSchema } from '@abapify/ts-xsd';

const personSchema = {
  element: [{ name: 'person', type: 'PersonType' }],
  complexType: [
    {
      name: 'PersonType',
      sequence: {
        element: [
          { name: 'name', type: 'xs:string' },
          { name: 'age', type: 'xs:int', minOccurs: 0 },
        ],
      },
    },
  ],
} as const;

// Infer TypeScript type at compile time — no runtime cost
type Person = InferSchema<typeof personSchema>;
// => { name: string; age?: number }

分析并用 Schema 构建 XML

import { parseXml, buildXml } from '@abapify/ts-xsd';

const xml = `<person><name>John</name><age>30</age></person>`;
const data = parseXml(personSchema, xml);
// => { person: { name: 'John', age: 30 } }

const rebuilt = buildXml(personSchema, data, { xmlDecl: false });
// => <person><name>John</name><age>30</age></person>

从 XSD 生成类型脚本接口

import { parseXsd, generateInterfaces } from '@abapify/ts-xsd';

const schema = parseXsd(xsdContent);
const { code } = generateInterfaces(schema, {
  flatten: true, // Inline all nested types into one
  addJsDoc: true, // Add JSDoc comments
  rootTypeName: 'MySchema',
});

// code is a ready-to-write .ts file:
// export type MySchema = { person: { name: string; age?: number } };

API 参考

XSD 模块

import {
  parseXsd,
  buildXsd,
  resolveImports,
  loadSchema,
  type Schema,
} from '@abapify/ts-xsd';

parseXsd(xsd: string): Schema

将 XSD XML 字符串分析为已键入 Schema 对象.

buildXsd(schema: Schema, options?: BuildOptions): string

从 a 构建 XSD XML 字符串 Schema 对象.

const xsd = buildXsd(schema, {
  prefix: 'xs', // Namespace prefix (default: 'xs')
  pretty: true, // Pretty print (default: true)
  indent: '  ', // Indentation string
});

resolveImports(schema, availableSchemas): Schema

通过匹配解决和链接导入的策略 import.schemaLocation 改为 $filename返回新的计划 $imports 人口众多.

const base = { ...parseXsd(baseXsd), $filename: 'base.xsd' };
const orders = { ...parseXsd(ordersXsd), $filename: 'orders.xsd' };

const linked = resolveImports(orders, [base]);
// linked.$imports = [base]

loadSchema(schemaPath: string, options?: LoaderOptions): Schema

从磁盘上装入并解析一个 XSD 文件 。 同步。 设定 autoLink: true 自动解决进口,或 autoResolve: true 将一切合并为一个计划.

const schema = loadSchema('/path/to/schema.xsd', { autoLink: true });

推断模块

import type { InferSchema, InferElement, SchemaLike } from '@abapify/ts-xsd';

InferSchema<T>

从图文体中推断出一个类型( S) :as const) (中文(简体) ). 返回所有根元素类型的结合.

InferElement<T, Name>

按名称推断特定根元素的类型.

type Person = InferElement<typeof schema, 'person'>;

内建类型映射

XSD 类型类型脚本
xs:string, (中文(简体) ), xs:token, (中文(简体) ), xs:NCNamestring
xs:int, (中文(简体) ), xs:integer, (中文(简体) ), xs:decimalnumber
xs:booleanboolean
xs:date, (中文(简体) ), xs:dateTime, (中文(简体) ), xs:timestring
xs:anyURI, (中文(简体) ), xs:QNamestring
xs:anyTypeunknown

XML 模块

import { parseXml, buildXml } from '@abapify/ts-xsd';

parseXml<T>(schema, xml: string): T

使用 schema 定义将 XML 字符串分析成一个被输入的对象 .

buildXml<T>(schema, data: T, options?: XmlBuildOptions): string

使用 schema 定义从打字对象中构建 XML 字符串 。 默认为 xmlDecl: true (包括: <?xml ...?> 声明); 通过 { xmlDecl: false } 用于裸出.

代码模块

import { generateSchemaLiteral, generateInterfaces } from '@abapify/ts-xsd';

generateSchemaLiteral(xsd: string, options?): string

生成类型脚本 as const 由 XSD 内容生成的图案文字——用于 InferSchema<T>。 。 。 .

const code = generateSchemaLiteral(xsdContent, {
  name: 'PersonSchema',
  features: { $xmlns: true, $filename: true },
  exclude: ['annotation'],
});
// export const PersonSchema = { ... } as const;

generateInterfaces(schema: Schema, options?): { code: string }

从解析的 schema 生成 TypeScript 接口 。 当计划过于复杂而无法编译时有用 InferSchema<T> (TypeScript TS2589 复发限制).

const { code } = generateInterfaces(schema, {
  flatten: true, // Inline all nested types (default: false)
  addJsDoc: true, // JSDoc comments
  rootTypeName: 'MySchema',
});
选项类型默认说明
flattenbooleanfalse将所有嵌入类型内置为一
addJsDocbooleanfalse添加联合来文文件评论
rootTypeNamestring自动根类型自定义名称

国 际

包装一个CLI用于代码生成:

# Config-based (recommended) — uses ts-xsd.config.ts in cwd
npx ts-xsd codegen

# Single-file mode
npx ts-xsd codegen person.xsd
npx ts-xsd codegen person.xsd ./generated/person-schema.ts
npx ts-xsd codegen person.xsd --name=PersonSchema

基于配置的生成

对于多方案项目,使用可堆肥发电机系统:

import {
  defineConfig,
  rawSchema,
  interfaces,
} from '@abapify/ts-xsd/generators';

export default defineConfig({
  sources: {
    base: {
      xsdDir: 'schemas',
      outputDir: 'src/generated',
      schemas: ['base'],
    },
    orders: {
      xsdDir: 'schemas',
      outputDir: 'src/generated',
      schemas: ['orders'],
      autoLink: true,
    },
  },
  generators: [rawSchema(), interfaces({ flatten: true })],
});

Schema 结构

这个 Schema 类型是 W3C XSD 的 1:1 类型脚本代表。 非W3C扩展属性前缀为 $数字 :

interface Schema {
  targetNamespace?: string;
  elementFormDefault?: 'qualified' | 'unqualified';

  // Composition
  import?: Import[];
  include?: Include[];

  // Declarations
  element?: TopLevelElement[];
  complexType?: TopLevelComplexType[];
  simpleType?: TopLevelSimpleType[];
  group?: NamedGroup[];
  attributeGroup?: NamedAttributeGroup[];

  // Extensions (non-W3C, prefixed with $)
  $xmlns?: { [prefix: string]: string }; // Namespace prefix mappings
  $imports?: Schema[]; // Linked imported schemas
  $filename?: string; // Source filename (for round-trip)
}

跨计划类型分辨率

链接计划通过 $imports 解决跨越计划边界的类别:

const base = { ...parseXsd(baseXsd), $filename: 'base.xsd' };
const orders = { ...parseXsd(ordersXsd), $filename: 'orders.xsd' };

const linked = resolveImports(orders, [base]);

// InferSchema can now resolve types from `base`
type OrderData = InferSchema<typeof linked>;

设计原则

  1. 纯 W3C XSD 1.1 - 类型与官员匹配 XML 计划 准确; 没有发明属性 .
  2. 类型安全 ——全TypeScript支持以编译-时间推论.
  3. 最小依赖性 —— 说 @xmldom/xmldom 为DOM解析, ts-morph 财务报告和审定财务报表 zod 代码源.
  4. 树能震动 - 进口你需要的东西.
  5. 经核实的往返旅行 ——针对官方W3C XMLSchema.xsd进行测试.

参考资料

许可证

麻省理工学院

版本与发布记录

@abapify/ts-xsd 共发布 31 个版本,首次发布于 2026/04/21;过去 12 个月发布了 31 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.4.34latest2026/11/033 天前
0.4.332026/11/023 天前
0.4.322026/11/023 天前
0.4.302026/10/316 天前
0.4.292026/10/306 天前
0.4.272026/10/307 天前

关于 @abapify/ts-xsd 的常见问题

@abapify/ts-xsd 是什么?

W3C XSD 1. 1 解析器, 构建器, 和 TypeScript 类型推论

如何安装 @abapify/ts-xsd?

在项目目录运行 npm install @abapify/ts-xsd,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 ts-xsd,可以用 npx ts-xsd 直接运行。

@abapify/ts-xsd 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@abapify/ts-xsd 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@abapify/ts-xsd 可以商用吗?

@abapify/ts-xsd 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@abapify/ts-xsd 的下载量有多少?

根据 npm 官方下载统计,@abapify/ts-xsd 在 2026/10/05 – 2026/11/03 这 30 天内被下载 13,560 次,日均约 452 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@abapify/ts-xsd 还在维护吗?

最新版本 0.4.34 发布于 2026/11/03(3 天前);至今共发布 31 个版本,其中过去 12 个月发布了 31 个;首次发布于 2026/04/21。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。