
TypeSpec 0.64 版本发布解读OpenAPI 3.1 输出、流元数据 API 与 VS Code 项目脚手架全解析【免费下载链接】typespec项目地址: https://gitcode.com/GitHub_Trending/ty/typespec导读本文围绕 TypeSpec 0.642025 年 1 月发布的官方发布说明展开逐条解读本次版本的核心能力升级typespec/openapi3首次支持输出 OpenAPI 3.1 规范、typespec/http新增getStreamMetadata流元数据 JS API、编译器与 VS Code 扩展的初始化模板Init Template体系全面落地并梳理全部 Bug 修复清单。通过结合当前仓库的源码实现与测试用例读者可以掌握openapi-versions等关键配置的完整用法、流式 API 的底层工作原理以及如何在 VS Code 中一键创建 TypeSpec 项目与安装全局编译器。一、版本概览与升级总览TypeSpec 0.64 是 2025 年 1 月发布的里程碑版本releaseDate: 2025-01-15其发布说明收录于仓库的 typespec-0-64.md。本次版本的核心亮点可以概括为三个方面OpenAPI 3.1 输出能力落地typespec/openapi3发射器新增openapi-versions配置项可同时输出 OpenAPI 3.0 与 3.1 两种规范同时支持typespec/json-schema装饰器。流式 API 编程接口完善typespec/http新增getStreamMetadataJS API为流式传输场景如 SSE提供了标准化的元数据获取入口。项目脚手架体验打通编译器与 VS Code 扩展协同支持通过初始化模板Init Template创建 TypeSpec 项目并允许用户自定义模板源。在升级之前建议先阅读仓库根目录的 README.md 与 CONTRIBUTING.md 了解项目整体结构与贡献方式再结合本文按模块验证新特性。二、Notable ChangesOpenAPI 3.1 发射支持2.1 配置方式0.64 版本中typespec/openapi3包开始支持输出 OpenAPI 3.1 规范。要启用该能力需要在tspconfig.yaml中为发射器设置openapi-versions选项emit: - typespec/openapi3 options: typespec/openapi3: openapi-versions: - 3.1.0也可以同时在命令行通过--option参数指定tsp compile . --emit typespec/openapi3 --option typespec/openapi3.openapi-versions[3.1.0]默认情况下发射器继续输出 OpenAPI 3.0 规范也就是说该选项在不配置时不改变既有行为升级 0.64 不会破坏现有流水线。2.2 源码层面的参数定义在 packages/openapi3/src/lib.ts 中openapi-versions被声明为字符串数组类型的发射器选项其当前支持的值域与默认值如下类型3.0.0 | 3.1.0 | 3.2.0默认值[3.0.0]约束uniqueItems: true元素不可重复、minItems: 1至少一项其中3.2.0为后续版本补充的能力见 packages/openapi3/CHANGELOG.md 中关于 Exposeopenapi-versionsemitter option now that both 3.1.0 and 3.2.0 are implemented 的记录在 0.64 时主要支持3.0.0与3.1.0。2.3 多版本输出行为在 packages/openapi3/src/openapi.ts 的resolveOptions中可以看到版本选择的核心逻辑const openapiVersions resolvedOptions[openapi-versions] ?? [3.0.0]; const specDir openapiVersions.length 1 ? {openapi-version} : ;当同时指定多个版本时输出文件会被组织到以版本号命名的子目录中。这一行为有对应的测试用例验证packages/openapi3/test/output-spec-versions.test.ts指定[3.0.0, 3.1.0]时分别生成3.0.0/openapi.yaml与3.1.0/openapi.yaml只指定单一版本如[3.0.0]时直接输出openapi.yaml不创建嵌套目录不指定该选项时默认输出openapi字段为3.0.0的文档指定[3.1.0]时输出文档的openapi字段为3.1.0。另外openapi-versions与enum-strategy存在联动约束在 packages/openapi3/src/openapi.ts 中当enum-strategy为annotated且版本列表中包含3.0.0时会报告enum-strategy-not-supported诊断错误这一点在 packages/openapi3/test/enums.test.ts 中有对应测试覆盖。2.4 输出文件名规则未显式配置output-file时输出文件名遵循{service-name-if-multiple}.{version}.openapi.{file-type}的模板。多服务、多版本场景下的实际命名示例来自 packages/openapi3/src/lib.ts 的选项描述单服务无版本openapi.yaml多服务无版本openapi.Org1.Service1.yaml单服务带版本openapi.v1.yaml、openapi.v2.yaml多服务带版本openapi.Org1.Service1.v1.yaml、openapi.Org1.Service2.v1.0.yaml三、Features新功能逐项拆解3.1 typespec/compiler初始化模板与语言服务器增强1. Init Template 支持 Emitter 选择0.64 起编译器为初始化模板增加了 Emitter 选择能力PR #5415、#5594。从 packages/compiler/src/init/init-template.ts 的模板结构定义可以看到模板可以声明emitters字段emitters?: Recordstring, EmitterTemplate;每个 EmitterTemplate 支持label在选择列表中展示的友好名称description说明文字selected是否默认选中options生成项目时预填充到tspconfig.yaml的发射器选项version可选的发射器版本未指定时使用latest。在 packages/compiler/src/init/init.ts 的selectEmitters中实现了交互式选择逻辑当模板声明了 emitters 时tsp init会通过多选checkbox提示用户选择要启用的发射器随后将选中结果写入新项目的配置。2. 编译器 Trace 通过语言服务器发送到 IDEPR #5316编译器运行时的 trace 日志不再局限于终端而是通过 TypeSpec Language Server 以 trace log 形式发送到 IDE 的日志面板便于在 VS Code 等编辑器中直接排查编译与发射过程中的内部细节。3. 语言服务器支持项目脚手架PR #5294TypeSpec Language Server 新增了在 IDE 内Scaffolding new TypeSpec project的能力配合 VS Code 扩展侧的命令即可在编辑器里完成项目初始化。3.2 typespec/http新增 getStreamMetadata JS APIPR #5153为typespec/http引入了getStreamMetadataJavaScript API用于从操作参数与响应中快速提取流元数据。该 API 属于实验性模块从 packages/http/src/experimental/index.ts 导出实现在 packages/http/src/experimental/streams.ts。其函数签名与返回结构如下export interface StreamMetadata { /** 被 body 装饰的属性的 Type */ bodyType: Type; /** 流模型本身的 Type例如 HttpStream 的一个实例 */ originalType: Type; /** 流式载荷的 Type例如给定 HttpStreamFoo, application/jsonlstreamType 为 Foo */ streamType: Type; /** 该流支持的内容类型列表 */ contentTypes: string[]; } export function getStreamMetadata( program: Program, httpParametersOrResponse: HttpOperationParameters | HttpOperationResponseContent, ): StreamMetadata | undefined;工作原理该函数从HttpOperationParameters或HttpOperationResponseContent中取出body若 body 不存在或没有声明 content-types 则直接返回undefined随后通过getStreamFromBodyProperty递归地沿着bodyProperty.model与bodyProperty.sourceProperty链查找流的来源调用typespec/streams包中的getStreamOf判定属性类型是否为流模型。值得注意的是typespec/streams采用动态导入的方式加载若依赖缺失会抛出typespec/streams was not found错误因此使用该 API 时需要确保安装了typespec/streams。这套 API 为后续流式场景如 SSE 服务器发射器的元数据消费提供了统一入口。3.3 typespec/openapi3JSON Schema 装饰器支持PR #5372为 OpenAPI 3.0 与 3.1 发射器增加对typespec/json-schema装饰器的支持。在源码层面packages/openapi3/src/json-schema.ts 封装了对typespec/json-schema模块的动态加载而 schema-emitter-3-0.ts 与 schema-emitter-3-1.ts 分别承载两个版本的 schema 发射实现。这意味着用户可以在 TypeSpec 定义中使用typespec/json-schema提供的装饰器如minLength、pattern等约束模型并让这些约束正确反映到生成的 OpenAPI schema 中。3.4 typespec-vscode客户端 SDK 生成与项目脚手架1. 集成客户端 SDK 生成PR #5312VS Code 扩展开始集成客户端 SDK 生成能力在编辑器内即可触发客户端代码生成流程。2. 扩展改名PR #5314扩展从 TypeSpec for VS Code 更名为 TypeSpec与包名typespec-vscode见 packages/typespec-vscode/package.json保持一致。3. Create TypeSpec Project 命令PR #5294、#5594在没有打开任何文件夹时VS Code 的命令面板与资源管理器EXPLORER中都可以执行 Create TypeSpec Project。同时新增设置项typespec.initTemplatesUrls允许用户配置额外的模板源其 JSON 结构为{ typespec.initTemplatesUrls: [ { name: displayName, url: https://urlToTheFileContainsTemplates } ] }其中name是模板在列表中展示的名称url指向包含模板定义的文件。4. 全局安装编译器PR #5594 配套VS Code 命令面板新增 Install TypeSpec Compiler/CLI globally 命令可一键全局安装 TypeSpec 编译器免去手动执行npm install -g typespec/compiler的步骤。四、Bug Fixes修复清单逐条解析4.1 typespec/compilerPR #5295修复负数Numeric被错误返回为正数BigInt的问题。这涉及编译器数值表示层的符号处理对使用大整数模型的场景影响较大。PR #5353Meta 属性补全功能完善目前支持::type、::parameters、::returnType三类元属性。这一能力面向属性即元数据meta property的反射式用法例如在装饰器内通过op::parameters获取操作参数集合。PR #5180修复 Union 上对象示例object examples的序列化问题保证example在联合类型上按对象形式正确输出。PR #5525修复枚举驱动的可见性装饰器如visibility与投影projection的交互问题使两者配合时行为符合预期。4.2 typespec/restPR #5455修复path装饰器在部分场景下无法准确反映所提供参数的问题其中涉及#{allowReserved: true}对应的x-ms-skip-url-encoding选项。此前该选项可能丢失或映射错误修复后path参数的 URL 编码控制能够正确传导到生成的 OpenAPI 文档。4.3 typespec/openapi3PR #5172允许void作为响应体类型response body type即使模型中还包含其他字段如statusCode。此前在模型同时含有void响应体与statusCode字段时会编译失败本次修复消除了这一限制使仅有状态码、无响应体的操作可以自然表达。PR #5456修复 OpenAPI YAML 输出中字符串被错误转换为布尔值的问题保证 YAML 序列化时类型保真。4.4 typespec/internal-build-utilsPR #5312修复当package.json中缺少包名name字段时程序崩溃的问题提升了内部构建工具对异常输入的健壮性。4.5 typespec-vscodePR #5413在没有打开工作区时不再启动 TypeSpec Language Server避免无谓的资源占用与后台进程。PR #5131新增 See Document 快速操作Quick Action可在编辑器中直接查看 lint 规则的文档详情。PR #5428改进tsp-server未找到时的控制台输出信息使环境问题更易定位。五、如何验证与升级到 0.645.1 版本确认可以通过tsp --version或查看 packages/compiler/package.json 中的版本号确认当前使用的编译器版本。升级命令npm install -g typespec/compiler0.64 # 或项目内升级 pnpm add -D typespec/compiler0.64 typespec/openapi30.64说明本仓库为 monorepo 结构pnpm-workspace.yaml各包独立版本发布。若使用旧版本配置请确认typespec/openapi3与编译器版本对齐。5.2 快速验证 OpenAPI 3.1 输出在项目根目录创建main.tspservice({ title: Demo }) namespace Demo; model Pet { id: string; name: string; } route(/pets) op listPets(): Pet[];配置tspconfig.yamlemit: - typespec/openapi3 options: typespec/openapi3: openapi-versions: - 3.0.0 - 3.1.0执行tsp compile .随后在tsp-output/typespec/openapi3/下可以看到3.0.0/openapi.yaml与3.1.0/openapi.yaml两个文件其中 3.1 版本文档的根字段openapi: 3.1.0并且对 nullable 等语义使用 3.1 的type: [string, null]表达方式。5.3 在 IDE 中体验新脚手架安装改版后的 TypeSpec 扩展后在未打开任何文件夹时通过命令面板执行Create TypeSpec Project选择模板后在 Emitter 选择界面勾选需要的发射器对应 Init Template 的emitters声明若需要自定义模板源在 VS Code 设置中添加typespec.initTemplatesUrls数组填入name与url即可。六、总结TypeSpec 0.64 的发布说明虽然以版本日志形式呈现但其技术含量不容小觑openapi-versions配置让 OpenAPI 3.1 输出从愿景变为开箱即用的能力当前仓库源码已进一步扩展至 3.2.0getStreamMetadata为流式 HTTP 场景提供了稳定的元数据抽象而编译器与 VS Code 协同的 Init Template 体系则显著降低了新项目的启动门槛。对于正在评估或使用 TypeSpec 的团队0.64 是在 OpenAPI 3.1 与项目脚手架体验上值得跟进的一个版本。如需进一步了解相关模块的完整 API可继续阅读 packages/openapi3/README.md、packages/http/README.md 与 packages/typespec-vscode/README.md。【免费下载链接】typespec项目地址: https://gitcode.com/GitHub_Trending/ty/typespec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考