ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Dagger TypeScript SDK 中的 TypeDefWithEnumMemberOpts:枚举成员注册的可选参数详解

Dagger TypeScript SDK 中的 TypeDefWithEnumMemberOpts:枚举成员注册的可选参数详解 Dagger TypeScript SDK 中的 TypeDefWithEnumMemberOpts枚举成员注册的可选参数详解【免费下载链接】daggerAutomation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud项目地址: https://gitcode.com/GitHub_Trending/da/dagger本篇技术指南围绕 Dagger 0.20 版本 TypeScript SDK 中TypeDefWithEnumMemberOpts类型别名展开讲解它在TypeDef.withEnumMember()调用中的四个可选属性value、description、sourceMap、deprecated的语义与用法并结合 SDK 源码说明 Dagger 模块中枚举是如何被扫描、注册并透传到引擎的。读完本文你将能够在编写 Dagger TypeScript 模块时精确控制枚举成员的取值、文档、源码定位与弃用提示。TypeDefWithEnumMemberOpts 是什么TypeDefWithEnumMemberOpts是 dagger.io/dagger 包中api/client.gen模块定义的一个Type Alias类型别名本质是一个object类型作为TypeDef.withEnumMember()方法的可选参数opts使用。在 Dagger 模块系统中TypeDef用于描述模块对外暴露的各类类型对象、枚举、接口、标量等而枚举Enum类型的构建分两步先用withEnum(name, opts)创建一个TypeDefKind.EnumKind的 TypeDef再反复调用withEnumMember(name, opts)为这个枚举添加静态成员。TypeDefWithEnumMemberOpts就是第二步中每个枚举成员携带的元信息集合。完整的类型定义位于 sdk/typescript/src/api/client.gen.tsexport type TypeDefWithEnumMemberOpts { /** * The value of the member in the enum */ value?: string /** * A doc string for the member, if any */ description?: string /** * The source map for the enum member definition. */ sourceMap?: SourceMap /** * If deprecated, the reason or migration path. */ deprecated?: string }对应的使用入口TypeDef.withEnumMember()位于同一文件 client.gen.ts/** * Adds a static value for an Enum TypeDef, failing if the type is not an enum. * param name The name of the member in the enum * param opts.value The value of the member in the enum * param opts.description A doc string for the member, if any * param opts.sourceMap The source map for the enum member definition. * param opts.deprecated If deprecated, the reason or migration path. */ withEnumMember ( name: string, opts?: TypeDefWithEnumMemberOpts, ): TypeDef { const ctx this._ctx.select(withEnumMember, { name, ...opts }) return new TypeDef(ctx) }注意withEnumMember要求当前 TypeDef 必须是枚举类型否则会失败failing if the type is not an enum。四个可选属性逐一解析value成员在枚举中的实际取值类型string可选语义该枚举成员在枚举中的取值即序列化/传输时使用的字符串值。value与namewithEnumMember的第一个参数是分离的name是成员在枚举中的标识名value是该标识名对应的底层值。例如一个日志级别枚举可以用withEnumMember(debug, { value: DEBUG })让 API 层面的名字与传输值解耦。description成员文档字符串类型string可选语义为该成员附带的文档字符串doc string会进入 Dagger 的 GraphQL 模式最终呈现为 API 文档、代码生成注释等面向开发者的说明文字。在 SDK 注册流程中description直接取自被扫描源码中成员上的 JSDoc 注释。sourceMap成员定义的源码映射类型SourceMap可选语义枚举成员定义的源码位置信息用于将引擎侧的类型定义回溯到模块源码中的具体文件与行列。SourceMap类在 client.gen.ts 中定义封装了column行内列号、filename模块源文件名、line文件内行号、module声明该成员的模块依赖以及url可选的文件链接 URL可用于在浏览器中跳转到源码位置等字段其构造器仅供内部使用开发者通常不需要手工创建。deprecated弃用原因或迁移路径类型string可选语义如果该成员已弃用此项给出弃用原因或迁移路径帮助调用方了解替代方案。一旦设置引擎会将该枚举成员标记为 deprecated并在下游 SDK 代码生成或 API 文档中体现例如生成的客户端代码会附带deprecated注释。引擎侧的对等实现Go 端参数序列化Dagger TypeScript SDK 的运行时同时维护了一套 Go 生成客户端位于 sdk/typescript/runtime/internal/dagger/dagger.gen.go。Go 端的TypeDefWithEnumMemberOpts结构与 TS 端一一对应// TypeDefWithEnumMemberOpts contains options for TypeDef.WithEnumMember type TypeDefWithEnumMemberOpts struct { // The value of the member in the enum Value string // A doc string for the member, if any Description string // The source map for the enum member definition. SourceMap *SourceMap // If deprecated, the reason or migration path. Deprecated string }WithEnumMember在序列化查询时会对每个可选参数做IsZeroValue判空只有非零值才会被附加到 GraphQL 查询参数中func (r *TypeDef) WithEnumMember(name string, opts ...TypeDefWithEnumMemberOpts) *TypeDef { q : r.query.Select(withEnumMember) for i : len(opts) - 1; i 0; i-- { if !querybuilder.IsZeroValue(opts[i].Value) { q q.Arg(value, opts[i].Value) } if !querybuilder.IsZeroValue(opts[i].Description) { q q.Arg(description, opts[i].Description) } if !querybuilder.IsZeroValue(opts[i].SourceMap) { q q.Arg(sourceMap, opts[i].SourceMap) } if !querybuilder.IsZeroValue(opts[i].Deprecated) { q q.Arg(deprecated, opts[i].Deprecated) } } q q.Arg(name, name) ... }从源码结构看withEnumMember是一个 GraphQL 选择器selectorTS 客户端通过this._ctx.select(withEnumMember, { name, ...opts })构造查询Go 运行时通过r.query.Select(withEnumMember)构造等价查询二者最终都落到引擎侧的同一个 GraphQL 字段上因此四个属性的语义在两条 SDK 路径下完全一致。实战模块枚举注册的全链路TypeDefWithEnumMemberOpts不是给最终用户手工拼装的高频 API而是 Dagger 模块运行时在注册阶段自动填充的元数据结构。注册入口在 sdk/typescript/src/module/entrypoint/register.ts// Register all enums defined by this modules Object.values(this.module.enums).forEach((enum_) { let typeDef dag.typeDef().withEnum(enum_.name, { description: enum_.description, sourceMap: addSourceMap(enum_), }) Object.values(enum_.values).forEach((value) { const memberOpts: TypeDefWithEnumMemberOpts { value: value.value, description: value.description, sourceMap: addSourceMap(value), deprecated: value.deprecated, } typeDef typeDef.withEnumMember(value.name, memberOpts) }) mod mod.withEnum(typeDef) })这段代码揭示了完整的调用链路模块启动时内省器introspector通过 TypeScript AST 扫描模块源码中声明的枚举见 sdk/typescript/src/module/introspector/dagger_module/enum.ts把每个成员解析成包含name、value、description、deprecated的DaggerEnumValue注册器先withEnum创建枚举 TypeDef再遍历enum_.values为每个成员构造TypeDefWithEnumMemberOpts并调用withEnumMember最终mod.withEnum(typeDef)把完整枚举挂到模块对象上提交给引擎。其中sourceMap由addSourceMap辅助函数生成register.ts它从被扫描节点的源码位置提取文件路径、行号、列号再调用dag.sourceMap(filepath, line, column)构建SourceMap对象function addSourceMap(object: Locatable): SourceMap { const { filepath, line, column } object.getLocation() return dag.sourceMap(filepath, line, column) }也就是说只要在模块源码中为枚举成员编写 JSDoc 注释或deprecated标记注册时就会自动被内省器提取并填充到TypeDefWithEnumMemberOpts的对应字段中无需手工维护。关联类型与 API 演进在api/client.gen中TypeDefWithEnumMemberOpts并非孤例它属于一组结构相近的TypeDefWith*Opts类型定义于 client.gen.ts类型别名用途属性差异TypeDefWithEnumOptswithEnum()创建枚举 TypeDef仅description、sourceMap无value、deprecatedTypeDefWithEnumMemberOptswithEnumMember()添加枚举成员value、description、sourceMap、deprecatedTypeDefWithEnumValueOpts旧版withEnumValue()添加枚举值description、sourceMap、deprecated无valueTypeDefWithFieldOptswithField()添加对象字段description、sourceMap、deprecated需要特别注意的是 API 演进方向withEnumMember取代了旧方法withEnumValue。在 client.gen.ts 中withEnumValue已被显式标记为deprecated Use withEnumMember instead它的value参数The name of the value in the enum在新的 API 中变成了withEnumMember的第一个位置参数name。因此在 0.20 版本中新代码应统一使用withEnumMember(name, { value, description, sourceMap, deprecated })TypeDefWithEnumMemberOpts就是该新 API 的规范参数类型。使用建议与注意事项字段全部可选按需提供四个属性均标注为optional为成员仅提供name即withEnumMember(active)也是合法的——此时成员取值为空字符串其他元信息为空。value用于显式控制序列化值当 API 成员名需要与传输值不同或下游如代码生成希望获得稳定字符串时务必显式传入value。description即文档在模块源码枚举成员上书写 JSDoc 注释注册时会自动进入description成为引擎侧模式的文档来源。deprecated标记迁移路径对计划移除的成员填写原因或替代方案让下游开发者平滑迁移。依赖withEnum前置withEnumMember只能作用于枚举类型 TypeDef若目标 TypeDef 不是枚举TypeDefKind不为EnumKind调用会失败构建顺序一定是先withEnum再withEnumMember。延伸阅读TypeDefWithEnumMemberOpts 官方参考SourceMap 类参考api/client.gen API 索引TypeScript SDK 模块注册实现TypeScript SDK 枚举内省实现【免费下载链接】daggerAutomation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud项目地址: https://gitcode.com/GitHub_Trending/da/dagger创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表