Dagger TypeScript SDK 中的 ScalarTypeDefID 类型别名:唯一标识符的定义、来源与实战用法

发布时间:2026/9/18 17:17:39

Dagger TypeScript SDK 中的 ScalarTypeDefID 类型别名:唯一标识符的定义、来源与实战用法 Dagger TypeScript SDK 中的 ScalarTypeDefID 类型别名唯一标识符的定义、来源与实战用法【免费下载链接】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导读ScalarTypeDefID是 Dagger TypeScript SDK 自动生成的 API 客户端中用于唯一标识一个ScalarTypeDef模块内自定义标量类型的定义的标识符类型。本文以该类型别名为切入点讲解其 TypeScript 类型结构、在 GraphQL schema 中的底层来源、在 Go 运行时中的对应实现以及它在模块类型定义withScalar与客户端调用链中的实际用途帮助你在编写 Dagger 模块或使用 TypeScript SDK 时正确理解 ID 的生成与消费方式。一、类型别名本体ScalarTypeDefID的定义解读该文档定义的类型别名位于 Dagger 0.21 版本的 TypeScript SDK 参考文档中ScalarTypeDefID.md其核心定义如下type ScalarTypeDefID string object并附带一条类型声明成员__ScalarTypeDefID: never这三点信息可以拆解为组成含义stringID 的底层载体是一个字符串最终作为 GraphQLID标量传输object交叉通过交叉类型为字符串附加对象唯一标识的类型约束使其不再等价于普通string__ScalarTypeDefID: never一个不可被赋值的内部成员从类型结构看它用于实现 TypeScript 的品牌类型branded type模式防止开发者把任意字符串误当作ScalarTypeDefID使用never类型的属性意味着任何对象字面量都无法显式满足该成员因此该类型只能由 SDK 内部构造产生用户在业务代码中无法伪造一个ScalarTypeDefID。这是一种典型的编译期类型安全手段在运行时它就是一个字符串但在类型系统里它被标记为某个对象的唯一标识。说明ScalarTypeDefID是生成代码中的类型别名它在 GraphQL 侧的官方描述为 A unique identifier for an object.某个对象的唯一标识符。二、GraphQL 侧来源scalar ScalarTypeDefID与ScalarTypeDef类型ScalarTypeDefID并非凭空定义它来自 Dagger 核心引擎的 GraphQL schema。在 core/schema/testdata/base_schema.graphqls 中可以找到它的完整出处A definition of a custom scalar defined in a Module. type ScalarTypeDef implements Node { A doc string for the scalar, if any. description: String! A unique identifier for this ScalarTypeDef. id: ID! The name of the scalar. name: String! If this ScalarTypeDef is associated with a Module, the name of the module. Unset otherwise. sourceModuleName: String! } A unique identifier for an object. scalar ScalarTypeDefID由此可以确认两个事实ScalarTypeDef是模块中定义的自定义标量的类型定义对象它实现了Node接口包含四个字段description标量的文档字符串doc stringid该ScalarTypeDef实例自身的唯一标识类型为ID!name标量的名字例如MyScalarsourceModuleName若该定义来自某个模块则为所属模块名否则为空。ScalarTypeDefID就是ScalarTypeDef.id在类型系统中的专属别名。GraphQL 把所有对象 ID 统一声明为scalar而各语言的 SDK 生成器会为每个对象类型生成对应的XxxID类型ScalarTypeDefID正是其中之一——它与SecretID、ServiceID、SocketID、TypeDefID等标识符类型并列见 base_schema.graphqls 中相邻的scalar声明。这种每个对象类型一个 ID 类型的设计使得不同对象的 ID 在编译期互相区分避免把SecretID误传给接受ScalarTypeDefID的 API。三、Go 运行时中的对应实现Dagger 的 TypeScript SDK 并非纯 TypeScript 实现其运行时内核由 Go 编写通过 gRPC 与 Dagger 引擎通信。生成的 Go 代码位于 sdk/typescript/runtime/internal/dagger/dagger.gen.go其中对应的定义是// A unique identifier for an object. type ScalarTypeDefID string这里 Go 侧用type ScalarTypeDefID string定义了基于字符串的命名类型与 TypeScript 侧string object的品牌类型在语义上完全对齐底层都是字符串但在类型层面被隔离。Go 的命名类型天然具备名义类型nominal type特性ScalarTypeDefID不能与普通string直接互换从而在跨语言边界GraphQL → Go 运行时 → TypeScript 客户端上保持了一致的类型约束。在同一生成文件中还可以看到与 ID 配套的加载入口dagger.gen.gofunc (r *Query) LoadScalarTypeDefFromID(id ScalarTypeDefID) *ScalarTypeDef即给定一个ScalarTypeDefID可以从引擎中重新加载出对应的ScalarTypeDef对象这是通过 ID 恢复对象引用的标准模式也是 ID 类型存在的核心意义。四、TypeScript 客户端中如何拿到ScalarTypeDefID在 TypeScript SDK 的生成客户端 sdk/typescript/src/api/client.gen.ts 中ScalarTypeDef类封装了对引擎的调用其中获取 ID 的方法如下/** * A unique identifier for this ScalarTypeDef. */ id async (): PromiseID { if (this._id) { return this._id } const ctx this._ctx.select(id) const response: AwaitedID await ctx.execute() return response }值得注意的实现细节每个ScalarTypeDef实例在构造时会缓存_id如果对象本身已经携带 ID直接返回缓存值不再发起网络请求这是 Dagger 客户端按需懒执行的常见优化只有缓存为空时才会通过this._ctx.select(id)向引擎发起一次 GraphQL 查询取回 ID返回类型在ScalarTypeDef类内部是PromiseIDID即对应 GraphQL 的ID标量而在文档层的类型别名中该 ID 的专属类型就是ScalarTypeDefID。同类还有description()、name()、sourceModuleName()方法分别对应 GraphQL 字段均遵循同样的懒加载模式见 client.gen.ts。五、实战场景模块类型定义与withScalarScalarTypeDef以及它的 ID最常见的产生场景是Dagger 模块的类型定义。当你在模块中注册自定义标量类型时SDK 会构造一个ScalarTypeDef随之产生一个唯一的ScalarTypeDefID。在模块入口的注册逻辑 sdk/typescript/src/module/entrypoint/register.ts 中类型分发函数会将枚举出的类型定义转换为 Dagger 引擎的TypeDeffunction addTypeDef(type: ScannerTypeDefTypeDefKind): TypeDef { switch (type.kind) { case TypeDefKind.ScalarKind: return dag.typeDef().withScalar((type as ScalarTypeDef).name) case TypeDefKind.ObjectKind: return dag.typeDef().withObject((type as ObjectTypeDef).name) // ... } }其中ScalarTypeDef模块内扫描得到的标量类型定义会被转换为dag.typeDef().withScalar(name)调用。withScalar在客户端中的签名位于 client.gen.tswithScalar (name: string, opts?: TypeDefWithScalarOpts): TypeDef { const ctx this._ctx.select(withScalar, { name, ...opts }) // ... }这条调用链可以完整串起来模块中声明的自定义标量类型 → introspector 扫描得到 ScalarTypeDef含 name 等字段 → register.ts 中 addTypeDef 调用 dag.typeDef().withScalar(name) → 引擎构造 TypeDef若其指向标量则内部对应 ScalarTypeDef 对象 → ScalarTypeDef.id() 返回该对象的 ScalarTypeDefID而在内省introspection侧sdk/typescript/src/module/introspector/typedef.ts 中定义了模块内类型系统的判别联合export type ScalarTypeDef BaseTypeDef { kind: TypeDefKind.ScalarKind name: string } export type TypeDefT extends BaseTypeDef[kind] T extends TypeDefKind.ScalarKind ? ScalarTypeDef : T extends TypeDefKind.ObjectKind ? ObjectTypeDef : T extends TypeDefKind.ListKind ? ListTypeDef : // ... BaseTypeDef这里TypeDef根据kind字段进行条件类型分派当kind为ScalarKind时TypeDef即被收窄为ScalarTypeDef携带name等标量专有信息。ScalarTypeDefID正是这一整套标量类型定义体系在持久化标识维度上的落点——当你需要在多次会话之间引用同一个标量定义对象时用它作为句柄。六、使用要点与注意事项不要手动构造ScalarTypeDefID由于__ScalarTypeDefID: never成员的存在类型系统阻止你在业务代码中伪造 ID请始终通过ScalarTypeDef.id()获取或通过LoadScalarTypeDefFromID消费已有的 ID。ID 在运行时是字符串跨进程、跨会话传递如存入数据库时它就是一个普通字符串类型约束只存在于编译期。ID 与对象生命周期从源码结构看ScalarTypeDefID用于唯一标识模块定义中的自定义标量类型对象在缓存、跨会话恢复、TypeDef引用等场景中扮演句柄角色。参考文档的定位本文所依据的 ScalarTypeDefID.md 属于自动生成的 API 参考页sidebar_label: TypeScript SDK Reference更完整的对象字段与方法请参阅同目录下的ScalarTypeDef类型说明以及 SDK 源码 client.gen.ts。总结ScalarTypeDefID表面上只是string object一行类型别名但它贯穿了 Dagger 的完整技术栈GraphQL 层scalar ScalarTypeDefID声明于 core/schema/testdata/base_schema.graphqlsGo 运行时层type ScalarTypeDefID string定义于 dagger.gen.goTypeScript 客户端层通过ScalarTypeDef.id()懒加载获取见 client.gen.ts模块定义场景经由withScalar与内省类型分派参与模块类型注册见 register.ts。理解这四层对应关系你就能在 Dagger 模块开发与 TypeScript SDK 使用中准确判断 ID 的生成时机、获取方式与类型约束避免把任意字符串误当成对象唯一标识使用。【免费下载链接】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),仅供参考
延伸阅读

更多相关文章

2026/9/18 17:12:38

CIC-IDS-2018协议感知预处理:从数据毛坯到攻击语义特征

1. 为什么CIC-IDS-2018的预处理总让人卡在第一步?你下载完CIC-IDS-2018数据集,解压出来30多个CSV文件,总大小接近80GB,点开第一个文件——好家伙,120列特征,时间戳是字符串格式,有的字段里塞着“…

2026/9/18 18:42:49

低功耗段码LCD驱动芯片TM16C21:原理、设计与实战排坑

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

2026/9/18 18:42:49

Element UI 样式文件深度解析:SCSS 变量、BEM 规范与主题定制实践

所有 Vue 2 项目里,Element UI 算是国内前端最熟悉的一张脸。但你有没有认真想过一个问题:我们在入口文件里写下import element-ui/lib/theme-chalk/index.css之后,浏览器到底加载了多少样式?这些样式文件又是按什么规则组织出来的…

2026/9/18 18:42:49

CANN pyasc 标量加法接口 `asc.language.basic.adds` 使用与原理深度解析

CANN pyasc 标量加法接口 asc.language.basic.adds 使用与原理深度解析 【免费下载链接】pyasc 本项目为Python用户提供算子编程接口,支持在昇腾AI处理器上加速计算,接口与Ascend C一一对应并遵守Python原生语法。 项目地址: https://gitcode.com/cann…

2026/9/18 18:42:49

AI Agent 驱动 Unity 自动化构建与测试:批处理模式与桥接层实战

前阵子,我们工作室一直在做 Unity 项目的自动化构建和持续验证,效果还行,但人肉参与度还是太高——每天打开编辑器、切平台、点 PlayMode 测试、看日志、传包,这一套下来少说半小时。后来我决定把 AI Agent 引进来,让它…

2026/9/18 18:37:48

沃尔玛物流系统建模:多级仓配与动态库存状态机设计

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

2026/9/18 14:13:01

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/18 14:13:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/18 14:13:02

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/18 14:13:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码