typescript-eslint 的 `rule-schema-to-typescript-types` 包:从 ESLint 规则 Schema 生成 TypeScript 类型定义
开发工具静态分析Lint代码质量【免费下载链接】typescript-eslint:sparkles: Monorepo for all the tooling which enables ESLint to support TypeScript项目地址https://gitcode.com/GitHub_Trending/ty/typescript-eslint点击查看免费下载typescript-eslint/rule-schema-to-typescript-types是 typescript-eslint 仓库中的一个内部工具包它读取规则在meta.schema中声明的 JSON Schemav4并输出与之等价的 TypeScript 类型字符串形如type Options [...]。这些生成结果既用于文档展示也作为规则类型定义的权威来源。读完本文你将理解该包的输入/输出约定、类型映射规则、$ref/$defs处理方式、错误边界与优化策略并能独立复现其核心能力。一、包定位内部工具服务于文档与类型生成在 typescript-eslint 这个 monorepo 中packages/rule-schema-to-typescript-types/README.md 明确声明这是一个Internal Package内部包面向 typescript-eslint 仓库自身的工具链而非面向最终用户的独立产品。官方文档页 docs/packages/RuleSchemaToTypeScriptTypes.mdx 对它的描述是一句话Converts ESLint rule schemas to equivalent TypeScript type strings ✨包的package.jsonpackages/rule-schema-to-typescript-types/package.json中 version 为8.71.1依赖了同仓库的typescript-eslint/type-utils与typescript-eslint/utils另外依赖natural-compare用于排序保证输出确定性Node 版本要求^18.18.0 || ^20.9.0 || 21.1.0。该包在整个仓库中的核心消费方是 eslint-plugin 的类型生成测试 packages/eslint-plugin/tests/schemas.test.ts它遍历所有规则的ruleDef.meta.schema调用schemaToTypes生成类型字符串再用 Prettier 格式化后写入schema-snapshots/*.shot快照文件。也就是说每一个规则的可读类型签名都来自这个包。对应的快照产物可见 packages/eslint-plugin/tests/schema-snapshots/例如no-unused-vars.shot其中# SCHEMA:段是原始 JSON Schema# TYPES:段是生成的类型定义。二、入口函数schemaToTypes输入与输出约定对外唯一入口是schemaToTypes实现在 src/index.tsexport function schemaToTypes( schema: JSONSchema4 | readonly JSONSchema4[], ): string关键行为输入可以是单个 JSON Schema v4 对象也可以是 schema 数组。JSONSchema4类型定义在 packages/utils/src/json-schema.ts对应 JSON Schema draft v4 的各个子类型JSONSchema4ObjectSchema、JSONSchema4ArraySchema、JSONSchema4RefSchema等。数组输入 → 元组类型数组被当作规则 options 的元组输出type Options [T0, T1, ...]对象输入 → 单一类型输出type Options T空数组输入返回固定的/** No options declared */type Options [];对应测试 tests/index.test.ts 的第一条用例$defs/definitions展开仅支持顶层的$defs或definitions源码注释we only support defs at the top level for simplicity每个定义键会被转换为 PascalCase 类型名toPascalCase首字母大写并同时注册#/$defs/{key}与#/items/{index}/$defs/{key}两个引用路径随后以引用类型在前、Options 类型在后、块间空行分隔的顺序拼接输出。官方文档页 docs/packages/RuleSchemaToTypeScriptTypes.mdx 给出的最小示例import { schemaToTypes } from typescript-eslint/rule-schema-to-typescript-types; schemaToTypes({ description: My great option!, items: { type: string }, type: array, }); // 输出 // type Options [ // /** My great option! */ // string[] // ];三、类型生成规则JSON Schema → TS 类型的映射核心递归逻辑在 src/generateType.ts处理顺序如下$ref优先命中refMap则生成TypeReferenceAST引用类型名enum把枚举值生成联合类型见第四节anyOf/oneOf均生成联合类型。源码注释特别说明anyOf在 JSON Schema 语义上其实是组合T、U、V 的任意交集组合但实践中大多被用来模拟oneOf因此本工具直接按联合类型处理type关键字按类型分发——any→unknown不生成any避免污染类型安全null→nullnumber/string→ 直接输出对应关键字boolean→booleaninteger→numberTS 无integer类型array→ 走generateArrayType第五节object→ 走generateObjectType第六节未声明type且不含$ref/enum/oneOf的 schema→ 抛出NotSupportedErroruntyped schemas without one of [$ref, enum, oneOf]type为数组多类型 schema→ 同样抛出NotSupportedError。显式不支持的关键字src/generateType.ts 定义了一组可能应该支持但当前不支持的关键字命中即抛NotSupportedErrorallOf, dependencies, extends, maxProperties, minProperties, multipleOf, not, patternProperties错误信息会带上完整 JSON 序列化的目标 schema方便定位问题。四、枚举与联合类型generateUnionTypesrc/generateUnionType.ts 负责把枚举成员转为联合类型成员字符串转成单引号字面量内部单引号会被转义为\数字 / 布尔值原样转成字面量对象递归走generateType不支持的成员null或数组出现在 enum 中会抛NotSupportedError。联合成员在输出时会被排序以保证确定性依赖natural-compare排序逻辑见 src/printAST.ts 的compareElements不同节点类型先按代码文本自然比较同为 tuple 时先按元素数量升序避免 natural-compare 把长元组排前面再按代码比较。五、数组与元组generateArrayType的启发式策略src/generateArrayType.ts 是策略最复杂的一环核心规则items缺失抛UnexpectedError{type: array}理论上可映射为any[]但过于宽松工具拒绝生成单类型数组items不是数组直接生成T[]即使声明了minItems/maxItems也不生成元组源码注释[T, ...T[]]形式虽然可行但为了文档可读性放弃参见 issue #11117items为数组 → 按元组处理并引入三个关键约束MAX_ITEMS_TO_TUPLIZE 20元组元素超过 20 个就不再元组化直接退化为数组类型以保证简洁maxItems语义只有当maxItems 20时才考虑若maxItems items.length且存在additionalItems对象形式则生成展开元素打印为...T[]maxItems小于 items 个数、或大于 items 个数却没有additionalItems都会抛UnexpectedErrorminItems语义当 items 个数多于minItems时不采用可选元素运算符[T, T?, T?]因为它允许[a, undefined, c]这种中间空洞而是生成元组的联合[T] | [T, T] | [T, T, T]保证每个位置类型更精确源码注释给出了这一类型安全论证且只有联合的最后一个元组带展开参数。例如测试中的用例[{ items: [{type:string}], type: array }]输出为type Options [ | [] | [string]]六、对象类型必填/可选属性与索引签名src/generateObjectType.ts 处理type: object的 schema属性必填性根据required数组判定不在required中的属性输出为可选?:。required非数组时按空集合处理属性名转义通过typescript-eslint/type-utils的requiresQuoting判断属性名是否需要加引号必要时输出prop-name形式索引签名additionalProperties true或未声明时索引签名类型为unknownadditionalProperties为对象时递归生成其类型。输出形式为[k: string]: T属性排序在打印阶段src/printAST.ts用naturalCompare对属性名排序保证无论声明顺序如何输出一致并强制把对象打印为多行。七、注释生成description → JSDocsrc/getCommentLines.ts 将 schema 的description作为注释行src/printAST.ts 的printComment负责排版单行描述 →/** description */多行 → 逐行加*前缀的多行 JSDoc描述中的任意换行符CRLF、CR、LF、行分隔符 U2028、段落分隔符 U2029都会被ASTUtils.LINEBREAK_MATCHER拆分为独立注释行——测试 tests/index.test.ts 对五种换行符分别断言了多行注释输出。八、AST 优化联合展开与去重src/optimizeAST.ts 在生成后对中间 AST 做一轮优化主要是针对联合类型递归优化所有子节点unwrapUnions展平嵌套联合并把外层联合的注释行前置到第一个元素上避免注释丢失按JSON.stringify去重联合成员注释注明这是hacky way to deduplicate union members。九、打印输出把 AST 渲染为类型字符串src/printAST.ts 定义了完整的打印器printTypeAlias输出/** 注释 */\ntype 别名 类型数组T[]若元素是联合则加括号(T | U)[]printAndMaybeParenthesize对象{\nprop: T;\n[k: string]: T}属性间用分号连接并强制换行注释说明这样能让 Prettier 稳定地按多行输出元组[T0,T1,...T[]]元素逐个打印含各自注释展开元素打印为...T[]联合每个成员前加/** 注释 */ |成员排序后按\n连接整行以空格开头因此快照中出现| a的样式。十、错误边界两种明确的异常src/errors.ts 定义了两种错误均携带完整的目标 schema JSON 以便排查NotSupportedError遇到当前不支持的特性如allOf、patternProperties、无类型且无$ref/enum的 schema、多类型数组、单类型数组配additionalItems、enum 中的null/数组UnexpectedError遇到不应发生的内部不一致如缺失items、maxItems与 items 数量矛盾、$ref找不到对应定义错误信息会列出所有已注册的 ref 路径。十一、在仓库中的真实应用schema-snapshots 工作流eslint-plugin 的 schemas.test.ts 展示了完整的落地用法遍历../src/rules/index.js导出的全部规则将ruleDef.meta.schema用 Prettier 格式化后写入快照的# SCHEMA:段对 enum 数组与对象属性做排序以保证跨平台稳定调用schemaToTypes(ruleDef.meta.schema)同样用 Prettier 格式化后写入# TYPES:段用toMatchFileSnapshot与 schema-snapshots/ 下的.shot文件比对从而在 CI 中保证schema 变更必须同步更新类型快照。以no-unused-vars.shotpackages/eslint-plugin/tests/schema-snapshots/no-unused-vars.shot为例其生成的类型节选type Options [ | local | { /** Whether to check all, some, or no arguments. */ args?: | all | none | after-used; argsIgnorePattern?: string; /** Whether to check catch block arguments. */ caughtErrors?: | none | all; caughtErrorsIgnorePattern?: string; // ... 其余属性 } | all, ];可以看到oneOf成员被展开为联合、enum 成员被排序、description被转成内联 JSDoc、非必填属性带?。这些快照同时是规则文档展示的素材来源因此该包保证了文档里看到的类型与规则实际校验的 schema 永远一致。十二、小结何时使用与边界提醒使用场景当你需要把 ESLint 规则的 options schema 转换为可读、可文档化的 TypeScript 类型时schemaToTypes是开箱即用的工具它也是 typescript-eslint 内部保证规则 schema 与类型文档一致性的基础设施。适用前提输入必须是 JSON Schema draft v4JSONSchema4且避免使用本工具明确不支持的allOf、dependencies、patternProperties等关键字。已知取舍anyOf按联合而非严格组合语义生成maxItems 20时不再元组化单类型数组忽略minItems/maxItems$defs/definitions仅支持顶层声明——这些都是为了文档可读性与实现简洁性做出的有意设计使用前应了解这些边界。赞分享开发工具静态分析Lint代码质量【免费下载链接】typescript-eslint:sparkles: Monorepo for all the tooling which enables ESLint to support TypeScript项目地址https://gitcode.com/GitHub_Trending/ty/typescript-eslint点击查看免费下载相关推荐ESET-KeyGen与GitHub Actions集成自动化生成ESET密钥的高效方法ESET KeyGen与GitHub Actions集成自动化生成ESET密钥的高效方法 ESET KeyGen是一款功能强大的ESET杀毒软件试用密钥与账号CLIArkType代码生成如何从JSON Schema自动生成TypeScript类型定义ArkType代码生成如何从JSON Schema自动生成TypeScript类型定义 ArkType是一个强大的TypeScript运行时验证库它能够从J后端OpenAPI TypeScript自定义类型映射终极指南从JSON Schema到TypeScript类型OpenAPI TypeScript自定义类型映射终极指南从JSON Schema到TypeScript类型 openapi typescript是一个强大的开发工具代码生成后端上一篇unlazy深度解析AI智能体完成度纪律神器用可运行门控杜绝半截活下一篇codex-lb配额管理深度解析搞懂5小时与周双窗口榨干账号每一滴配额创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

【Linux网络】_udp_socket(认识)

【Linux网络】_udp_socket(认识)

hello~ 很高兴见到大家! 这次带来的是Linux网络中关于网络基础这部分的一些知识点,如果对你有所帮助的话,可否留下你宝贵的三连呢? 个 人 主 页: 默|笙 文章目录一、Echo sever (v1代码)1.1 给程序占好本机的 IP 端口1. socket (创建套接字对象)2. 填充…

2026/10/11 6:04:00 阅读更多 →
英文SCI降AI率实战:QuillBot、Grammarly与Writefull组合用法

英文SCI降AI率实战:QuillBot、Grammarly与Writefull组合用法

先说一个我最近被问到很多次的问题:明明用了AI辅助写作,英文SCI初稿也搭得有模有样,可稿子投出去总被审稿人评价"语言不自然",有的甚至直接建议退稿,问题到底出在哪?作为自己动手写SCI、也带过一…

2026/10/11 6:04:00 阅读更多 →
STM32驱动HC-05蓝牙模块实测:EN脚判模式、AT模式38400固定波特率与指令回显吞噬问题

STM32驱动HC-05蓝牙模块实测:EN脚判模式、AT模式38400固定波特率与指令回显吞噬问题

文章目录 摘要 前言 一、硬件认识:HC-05 的双模式与板载 LED 判读 1.1 两种模式的本质区别 1.2 引脚定义与电平细节 1.3 用 EN 引脚判别模式的实测结论 二、AT 指令配置:链路打通与参数固化 2.1 USB 转 TTL 直连配置(推荐的首选路径) 2.2 通过 STM32 串口发 AT 指令(进阶路…

2026/10/11 6:02:59 阅读更多 →

最新新闻

【大数据毕设项目】基于数据挖掘的商场商铺业态结构与客流相关性分析系统\基于spark技术的商场商铺经营态势感知与可视化研究

【大数据毕设项目】基于数据挖掘的商场商铺业态结构与客流相关性分析系统\基于spark技术的商场商铺经营态势感知与可视化研究

文章目录 一、项目开发背景意义 二、项目开发技术 三、项目开发内容 四、项目展示 五、项目相关代码 六、最后 一、项目开发背景意义 随着城市化进程加快与商业地产规模的不断扩张,商场运营产生了涵盖销售、客流、租金、商铺属性等多维度的海量数据。传统的数…

2026/10/11 6:44:24 阅读更多 →
笔记本也想 4K 生图?Ryzen AI Max+395 实战:ROCm 适配、HIP 显存碎片与 BOM 编码三连坑

笔记本也想 4K 生图?Ryzen AI Max+395 实战:ROCm 适配、HIP 显存碎片与 BOM 编码三连坑

笔记本也想 4K 生图?Ryzen AI Max395 实战:ROCm 适配、HIP 显存碎片与 BOM 编码三连坑 【免费下载链接】Qwen-Image-2.1-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/abenzerps/Qwen-Image-2.1-GGUF "4K 生图"这四个字&#xf…

2026/10/11 6:44:24 阅读更多 →
YOLOv5小目标检测实战:草地冬虫夏草识别与调优指南

YOLOv5小目标检测实战:草地冬虫夏草识别与调优指南

简介:面向草地环境下冬虫夏草检测需求的YOLOv5完整方案,包含已标注数据集、可运行源码与预训练权重,适合计算机视觉学习者、农业智能化研究人员及目标检测开发者。包体共1552个文件,总量129.43MB,以748张jpg图像和615个…

2026/10/11 6:44:24 阅读更多 →
mermaid-rs-renderer 主题定制指南:用 themeVariables 让 Mermaid 图表融入你的文档

mermaid-rs-renderer 主题定制指南:用 themeVariables 让 Mermaid 图表融入你的文档

【免费下载链接】mermaid-rs-renderer A fast native Rust Mermaid diagram renderer. No browser required. 500-1000x faster than mermaid-cli. 项目地址: https://gitcode.com/gh_mirrors/me/mermaid-rs-renderer 点击查看 免费下载 mermaid-rs-renderer&#…

2026/10/11 6:44:24 阅读更多 →
Ambxst GPU优化技巧:多屏Variants模式与GLSL统一面板特效的底层原理

Ambxst GPU优化技巧:多屏Variants模式与GLSL统一面板特效的底层原理

【免费下载链接】Ambxst An Axtremely customizable shell. 项目地址: https://gitcode.com/gh_mirrors/am/Ambxst 点击查看 免费下载 Ambxst 是一款可深度定制的 Linux 桌面 Shell(基于 Quickshell,适配 Hyprland / Niri)。它的…

2026/10/11 6:44:24 阅读更多 →
国产研发管理平台推荐:技术决策者选型指南(2026)

国产研发管理平台推荐:技术决策者选型指南(2026)

国产研发管理平台是指面向中国企业研发团队、支持私有化部署或信创适配、覆盖代码托管至项目交付全链路的数字化研发管理工具。在信创合规与研发效能双重驱动下,Gitee、禅道、PingCode 等国产平台已形成差异化竞争格局,技术决策者需结合企业规模、行业合…

2026/10/11 6:43:24 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →