@dazl/typescript-schema-extract

中文文档
15.5.2发布于 2026/07/09UNLICENSEDES Module近 30 天下载 1万

Schema 提取器将代码文件中的所有类型(说明或推断)转换为 JSON- 计划 计划 Schema提取是创建您代码自动化文档的必要步骤.

中文使用文档
文档目录5 节
  1. 使用量
  2. 结果实例
  3. 链接
  4. TS 变形器
  5. 创建自定义链接器

Schema 摘录

Schema 提取器将代码文件中的所有类型(说明或推断)转换为 JSON- 计划 计划 Schema提取是创建您代码自动化文档的必要步骤.

它由两个部分组成: ts 变压器 财务报告和审定财务报表 链接。 。 。 .

Schema 服务

schema服务允许观看特定的schema's,处理请求之间的缓存. 它发送一个更新事件, 具体说明文件无效后哪些类型已更新

它允许观看模块/Ast节点的策略. 获取有限的 Schema 深度 并扩展一个特定的分支 计划以后.

这允许图形用户界面只请求其读取的图案部分.

永远记得释放你的监视路径

使用量

要使用 Schema 提取项目从文件中提取类型数据,请导入 createLinker 函数从 @dazl/typescript-schema-extract。此函数收到一系列文件路径的字符串,并返回已初始化的链接类.

创建链接器后, 引用 linker.flatten它收到两个参数,并将返回我们要求的实体的链接计划(在 exportName:

名称类型说明
文件string我们要转换的文件路径
导出Namestring该文件中的导出实体, 我们希望链接
    import {createLinker} from '@dazl/typescript-schema-extract';
    const files = [
        'myProject/src/file-a.ts',
        'myProject/src/file-b.ts'
    ];
    const linker = createLinker(files);
    const linkedSchema = linker.flatten(files[0], 'IAnimal');

说明: 如果您想使用不同提取器的链接器,请查看 创建自定义链接区域。 。 。 .
此外,目前还无法自动链接一个文件的所有输出。 您可以查看文件的输出并引用 flatten 但是这可能不是一个有效的过程.

结果实例

为了更好地理解变换是如何运作的,请查看以下界面: 变换:

// file-a.ts
export interface IAnimal {
  name: string;
  hasTail: boolean;
  makeNoise: (sound: ISound) => void;
  isTamed?: 'YES' | 'NO';
}

如果我们使用TS变压器进行改造,我们可以得到以下计划:

{
  "$id": "/index.tsx",
  "$ref": "common/module",
  "properties": {},
  "definitions": {
    "IAnimal": {
      "properties": {
        "name": {
          "type": "string"
        },
        "hasTail": {
          "type": "boolean"
        },
        "makeNoise": {
          "$ref": "common/function",
          "arguments": [
            {
              "$ref": "#ISound",
              "name": "sound"
            }
          ],
          "returns": {
            "$ref": "common/undefined"
          },
          "requiredArguments": ["sound"]
        },
        "isTamed": {
          "type": "string",
          "enum": ["YES", "NO"]
        }
      },
      "required": ["name", "hasTail", "makeNoise"],
      "$ref": "common/interface"
    }
  }
}

链接

链接器接收文件名和该文件中的导出名称,并返回该导出链接的策略 .

怎么会有区别呢 ts transformer当我们用 ts transformer,我们得到的结果将只使用 $ref 属性来引用其他类型(导入或来自同一文件).

链接器通过将它们连在一起来平分其中一些类型.

示例

让我们看看以下代码中的界面B:

export interface InterfaceA<T> {
  something: T;
}
export interface InterfaceB extends InterfaceA<string> {
  somethingElse: number;
}

如果我们使用TS变压器来改变这个文件,我们将得到以下方案:

{
  "$id": "/index.tsx",
  "$ref": "common/module",
  "properties": {},
  "definitions": {
    "InterfaceA": {
      "$ref": "common/interface",
      "properties": {
        "something": { "$ref": "#InterfaceA!T" }
      },
      "required": ["something"],
      "genericParams": [{ "name": "T" }]
    },
    "InterfaceB": {
      "$ref": "common/interface",
      "properties": {
        "somethingElse": { "type": "number" }
      },
      "required": ["somethingElse"],
      "genericArguments": [{ "type": "string" }],
      "extends": {
        "$ref": "#InterfaceA"
      }
    }
  }
}

但我们缺少一些关于界面B的关键信息。 连接后, InterfaceB 的图案将变成:

    "InterfaceB": {
        $ref: "common/interface",
        properties: {
            something: {
                inheritedFrom: '#InterfaceA',
                type: 'string'
            },
            somethingElse: {
                type: 'number'
            }
        },
        required: ['somethingElse', 'something']
    };

连接规则

为了避免跑入无限回路,链接器并不将每个计划中的每个成员链接. 它确实链接:

  • extends - 使用扩展关键字的类和接口。 (但链接器不会链接界面成员)
  • 一般类型
  • 交叉类型 - 我们可能需要连接的策略来交叉两种或两种以上不同的类型.

什么不会是联系?

  • 进口 - 如果您从不同的文件中导入一个类型, 它将作为引用 : $ref: "myProject/src/util#myFunction"
  • 提及其他类型 - 任何形式提及不同类型或界面,如 type A = B 或者说 interface InterfaceA { type: InterfaceB }。这还包括使用其他类型作为参数或返回值的函数.

TS 变形器

将打字源文件转换为无链接的JSON-Schema. 默认情况下,链接器正在使用这个变压器,除非您想要一个非链接的变压器,否则无需使用这个变压器.

使用量

导入 transform 函数从 @dazl/typescript-schema-extract。该函数收到以下五个论据:

名称类型说明
检查器typescript.TypeChecker连接到想要的文件的打字检查器
源文件typescript.SourceFile我们要改变的打字源
模块Pathstring模块基础目录的路径
图像string文件所在的项目名称( 未来将删除)
路径UtilIFileSystemPath用于访问目录和文件的路径工具 。 (你可以使用 path.posix(中文(简体) )

例如,如果我们想要改变自己的代码:

    import path from 'path';
    import compilerOptions from './utils';

    const projectPath = '/Projects/MySecretProject/;
    const fileName = projectPath + 'secret-stuff.ts'
    // TS setup
    const program = typescript.createProgram([fileName], compilerOptions);
    const sourceFile = program.getSourceFile(fileName);

    const schema = transform(program.getTypeChecker(), sourceFile, fileName, 'MySecretProject', path.posix);

外观结构( T)

您可以找到计划的结构 和我们所支持的不同类型 json-schema 类型

创建自定义链接器

说明数字 : 目前我们不出口SchemaLinker级。我们将导出它或添加一个接收提取器并返回链接器的函数

使用 createLinker 创建以打字为主的链接器,但链接器不仅限于打字. 在创建新的链接类时,链接器会接收一个提取对象:

    export interface ILinkerOptions {
        getSchema: (path: string) => ModuleSchema;
    }

ILinkerOptions 接收文件的路径并返回从该文件创建的 JSON-Schema .

要使用与链接器不同的取出器,只需与取出器创建出一个新的取出器类并引用平分.

    flatten(filePath: string, typeName: string): Schema

平面函数接收文件路径以及我们想要链接的其中的类型 .

import { SchemaLinker } from '@dazl/typescript-schema-extract/?????';
import { myExtractor } from './secretStuff';

function linkSchema(filePath, typeName) {
  const customLinker = new SchemaLinker(myExtractor);
  return linker.flatten(filePath, typeName);
}

版本与发布记录

@dazl/typescript-schema-extract 共发布 10 个版本,首次发布于 2025/08/28;过去 12 个月发布了 9 个版本。

版本发布日期距今
15.5.2latest2026/07/094 个月前
15.5.12026/07/094 个月前
15.5.02026/05/106 个月前
15.4.12026/05/076 个月前
15.4.02026/04/067 个月前
15.3.52025/12/1510 个月前

关于 @dazl/typescript-schema-extract 的常见问题

@dazl/typescript-schema-extract 是什么?

Schema 提取器将代码文件中的所有类型(说明或推断)转换为 JSON- 计划 计划 Schema提取是创建您代码自动化文档的必要步骤.

如何安装 @dazl/typescript-schema-extract?

在项目目录运行 npm install @dazl/typescript-schema-extract,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:typescript(^4.0.0 || ^5.0.0 || ^6.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@dazl/typescript-schema-extract 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/dazl__typescript-schema-extract 是否存在。

@dazl/typescript-schema-extract 支持 ESM 还是 CommonJS?

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

@dazl/typescript-schema-extract 可以商用吗?

@dazl/typescript-schema-extract 使用 UNLICENSED 许可。作者声明为 UNLICENSED,即不授予公开使用许可(与公共领域的 Unlicense 不同)。使用前需获得作者授权。以上为概括,不构成法律意见,请以许可原文为准。

@dazl/typescript-schema-extract 的下载量有多少?

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

@dazl/typescript-schema-extract 还在维护吗?

最新版本 15.5.2 发布于 2026/07/09(4 个月前);至今共发布 10 个版本,其中过去 12 个月发布了 9 个;首次发布于 2025/08/28。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。