Dagger TypeScript SDK FunctionCallID 类型全解析:从类型别名到 GraphQL 调用链
发布时间:2026/9/17 3:08:19
分类:文化教育
浏览:1234

Dagger TypeScript SDK FunctionCallID 类型全解析从类型别名到 GraphQL 调用链【免费下载链接】daggerAutomation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud项目地址: https://gitcode.com/GitHub_Trending/da/daggerFunctionCallID是 Dagger 0.20 版本 TypeScript SDKdagger.io/daggerapi/client.gen模块中为FunctionCall对象定义的类型别名Type Alias用于标识一次正在执行的模块函数调用。本文将以该类型为切入点剖析其string object的交叉类型声明、never哨兵字段的标称类型branded type技巧并结合仓库中 Go 生成代码与引擎端 GraphQL 字段定义还原 ID 从类型声明到 GraphQL 调用链的完整闭环帮助你正确地在模块开发与 SDK 客户端编程中使用这一标识符。类型定义string object与never哨兵字段在 Dagger v0.20 TypeScript SDK 的官方 API 参考中FunctionCallID的定义为FunctionCallIDstringobject其唯一成员是__FunctionCallID类型为never见 FunctionCallID.md。string基础类型表示该 ID 在运行时本质是一个字符串。Dagger 的 GraphQL 引擎为每个对象实例序列化出不透明opaque的 ID客户端拿到后可以作为普通字符串保存、传输或在进程间传递。 object与__FunctionCallID: never这是 TypeScript 中经典的标称类型branded/nominal type模式。通过把string与一个只含never类型字段的对象做交叉编译器会认为该类型拥有一个永远不可能真实存在的属性从而普通string无法隐式赋值给FunctionCallID普通字符串没有__FunctionCallID属性类型系统因此能区分任意字符串与FunctionCall 的 ID不同实体的 ID 类型如FunctionCallID、ContainerID、FileID等彼此也不可混用避免把某个对象的 ID 误传给另一个对象never保证这只是编译期的类型标签运行时并不产生任何额外字段或开销。类型别名 vs 接口文档用type FunctionCallID ...而非interface说明它是对既有类型的组合而非声明新对象形状对应的 GraphQL 侧它本质是ID标量而非对象类型。语义FunctionCall 对象的唯一标识符文档给出的语义说明为TheFunctionCallIDscalar type represents an identifier for an object of type FunctionCall.即FunctionCallID是 GraphQL 标量类型代表一个FunctionCall对象的标识符。FunctionCall在 Dagger 中表示一次正在执行的函数调用An active function call其完整能力定义在 FunctionCall.md 中包括name()被调用函数的名称parent()被调用函数所属父对象的值模块顶层函数恒为空对象{}parentName()父对象名称顶层函数时为模块名inputArgs()本次调用传入的参数值列表FunctionCallArgValue[]returnValue(value)以 JSON 序列化形式设置函数调用的返回值returnError(error)返回一个错误id()返回本FunctionCall的唯一标识符即PromiseFunctionCallID。其中id()的签名是id(): PromiseFunctionCallID说明FunctionCallID是对外暴露该对象身份的入口——你可以先取得FunctionCallID保存它再通过它把FunctionCall重新装载回客户端上下文。在 SDK 中的使用获取、保存与装载FunctionCallID在客户端 API 中有两条典型使用路径。1. 从FunctionCall对象取 IDimport { client } from dagger.io/dagger; const fnCall client.currentFunctionCall(); const id: FunctionCallID await fnCall.id(); // id 是 string { __FunctionCallID: never } 类型 // 可以序列化、存储但不会被误当作普通字符串使用2. 通过 ID 重新装载对象在Client类Client.md中提供对应的装载方法签名形如loadFunctionCallFromID(id: FunctionCallID): FunctionCall这与 Go 侧生成的Query.LoadFunctionCallFromID(id FunctionCallID) *FunctionCall一一对应见 dagger.gen.go。这种ID 装载器loader模式在 Dagger SDK 中广泛存在ContainerID、DirectoryID、FileID等全部遵循同一约定——ID 即指向引擎中 DAG 节点的句柄load*FromID负责把句柄重新绑定为可继续调用的客户端对象。此外模块 SDK 运行时还提供dag.currentFunctionCall()对应 Go 的Query.CurrentFunctionCall()见 dagger.gen.go用于获取SDK 调用方当前正在执行的 FunctionCall 上下文这正是 module.go 中currentFunctionCall字段与CurrentFunctionCall查询的用途。底层原理从 TypeScript 别名到 GraphQL 调用链FunctionCallID的 TypeScript 类型并非孤立存在它与引擎端的 GraphQL 标量及各语言生成代码深度绑定。GraphQL 标量层。在引擎 schema 定义中FunctionCall是一个 GraphQL 对象类型其 ID 字段以 GraphQLID标量编码。Go 代码生成器产出的客户端类型别名直接印证了这一点type FunctionCallID ID见 dagger.gen.go。同时生成的客户端为每个对象实现内部协议方法XXX_GraphQLType()返回原生 GraphQL 类型名如FunctionCallXXX_GraphQLIDType()返回 ID 的底层类型IDXXX_GraphQLID(ctx)返回底层类型 ID 的字符串值见 dagger.gen.go。这意味着无论 TypeScript 还是 Go 客户端FunctionCallID在线上都表现为 GraphQLID标量的字符串序列化后可通过装载器重新解析。ID 的惰性获取。生成代码中的ID()方法并非始终触发网络请求——若对象已持有缓存的id字段则直接返回否则才执行query.Select(id)发起 GraphQL 查询见 dagger.gen.go。这种惰性求值 本地缓存的设计贯穿 Dagger 所有 ID 类型也是引擎侧 DAG 惰性求值lazy evaluation机制的客户端体现。引擎端字段注册。在引擎端 module.go 中FunctionCall对象的字段通过dagql.Fields[*core.FunctionCall]注册包括dagql.Fields[*core.FunctionCall]{ dagql.Func(returnValue, s.functionCallReturnValue). WithInput(dagql.PerClientInput). DoNotCache(Imperatively records the active function call result.). Doc(Set the return value of the function call to the provided value.). Args(dagql.Arg(value).Doc(JSON serialization of the return value.)), dagql.Func(returnError, s.functionCallReturnError). WithInput(dagql.PerClientInput). DoNotCache(Imperatively records the active function call result.). Doc(Return an error from the function.). Args(dagql.Arg(error).Doc(The error to return.)), }.Install(dag)注意两点值得关注PerClientInputDoNotCachereturnValue/returnError是命令式imperative副作用操作用于把当前函数调用的结果记录下来因此明确禁止缓存且按客户端隔离输入避免结果被错误复用实现位置functionCallReturnValue/functionCallReturnError的实现位于 module.go与 SDK 调用方的returnValue(value)/returnError(error)方法一一对应构成完整调用链TypeScript 客户端方法 → GraphQL 字段 → dagql 字段处理器 → 引擎记录调用结果。典型应用场景模块函数调用协议FunctionCall与FunctionCallID是 Dagger 模块Module函数调用协议的核心构件。当引擎调用某个模块导出的函数时会为这次调用建立FunctionCall上下文SDK 运行时的入口代码由代码生成器产出如 dagger.gen.go 中的fnCall : dag.CurrentFunctionCall()据此获取函数名、父对象与参数执行函数体后调用returnValue回写结果或调用returnError上报失败。在这一流程中FunctionCallID的价值在于作为该次调用的稳定标识可用于日志追踪、跨会话关联或调试排查为ID 装载提供入口持有 ID 即可在任何客户端上下文中恢复FunctionCall对象无需重新发起调用类型系统层面防止 ID 被误用如把FunctionCallID传给ContainerID参数这是多实体 ID 并存的 GraphQL API 中重要的编译期安全保障。使用注意要点ID 是运行时生成的FunctionCallID是引擎在函数调用生命周期内分配的句柄同一对象的 ID 是稳定的但不同调用之间不保证可复用且 ID 不透明——不要尝试解析其内部结构。仅在客户端协议中使用FunctionCallID属于客户端生成 APIclient.gen层用于客户端与引擎之间的对象寻址模块业务代码中通常接触的是FunctionCall对象本身而非裸 ID。类型不等于接口它是string与object的交叉类型别名运行时仅是一个字符串不要试图读取__FunctionCallID属性它永远不会存在这正是never的意义。配合装载器使用若需要先取 ID、稍后再用请通过loadFunctionCallFromID装载不要手工拼接或修改 ID 字符串。延伸阅读类型别名定义原文FunctionCallID.mdFunctionCall对象完整 APIFunctionCall.md客户端模块总览README.md引擎端字段注册与实现core/schema/module.go、core/schema/module.goGo 生成代码中的 ID 类型与装载器dagger.gen.go、dagger.gen.go【免费下载链接】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),仅供参考