
Metabase Embedding SDK 的ActionResultForDelete单行删除动作响应类型深度解析【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabaseActionResultForDelete是 Metabase Embedding SDK 中用于描述单行删除动作Action执行结果的 TypeScript 类型。本文以 ActionResultForDelete.md 为骨架结合仓库内前端源码与类型定义完整解析该类型的字段语义、与其它动作响应类型的判别关系以及在useActionHook 中的实际收窄用法帮助开发者正确处理删除类动作的返回值。类型定义删除动作的响应体ActionResultForDelete的定义极其简洁只有一个必填属性type ActionResultForDelete { rows-deleted: readonly RowValue[]; };它的语义在文档中同样只有一句话Response from a single-row delete — the affected primary keys.即这是单行删除操作返回的响应其中承载的是被删除行的主键Primary Keys。这意味着当你在 Embedding SDK 中执行一个删除单行的隐式动作implicit actionkind row/delete时后端返回的响应体形状就是这个结构——它不会告诉你删了多少行而是直接告诉你删的是哪一行哪些主键。属性详解属性类型说明rows-deletedreadonly RowValue[]被删除行的主键值数组readonly保证数组不可被外部修改值得注意的细节必填而非可选与批量删除结果ActionResultForBulk中可选的rows-deleted?: number不同这里的rows-deleted是必填字段因为单行删除的响应一定包含该数组。readonly修饰符类型层面禁止对返回数组执行push、splice等修改操作体现 API 返回数据只读消费的契约。rows-deleted的元素类型RowValuerows-deleted数组的每个元素是RowValuetype RowValue string | number | null | boolean | object;RowValue是 Metabase 查询结果或动作响应中单个值的宽泛联合类型涵盖了主键可能出现的所有形态number最常见的自增数字主键stringUUID 或业务字符串主键boolean/null/object理论上的边界情况如复合主键的一部分、可空列。由于主键通常是数字或字符串rows-deleted在绝大多数场景下呈现为(number | string)[]但类型层面保留了全部可能性避免在复合主键或特殊数据类型下产生类型错误。源码佐证前端如何消费rows-deletedrows-deleted不仅存在于 SDK 的类型文档中在前端主应用Metabase 本身的动作执行逻辑里也能找到它的实际消费逻辑。在 frontend/src/metabase/actions/utils.ts 中function hasDataFromExplicitAction(result: any) { const isInsert result[created-row]; const isUpdate result[rows-affected] 0 || result[rows-updated] 0; const isDelete result[rows-deleted]?.[0] 0; return !isInsert !isUpdate !isDelete; }这段代码揭示了两个关键事实rows-deleted确实是一个数组——通过result[rows-deleted]?.[0]取第一个元素来判断是否删除了行删除行数不为空时主应用不会把原始结果 JSON 原样展示给用户——只有当rows-deleted数组为空未删除任何行时才会走显示结果 JSON的分支否则显示配置好的成功消息如成功删除。这印证了 SDK 文档对ActionResultForDelete的设计数组长度表达删除是否发生元素则携带被删主键。判别联合AnyActionResult与类型收窄ActionResultForDelete并不是孤立存在的类型它是AnyActionResult判别联合discriminated union的一员type AnyActionResult | ActionResultForCreate | ActionResultForUpdate | ActionResultForDelete | ActionResultForBulk | ActionResultForSql;当你在useActionHook 中不提供TKind泛型时result的默认类型就是这个联合——而不是宽松的Recordstring, unknown。这样做的收益在于即使作者事先不知道动作的种类也能通过key in result语法进行安全的类型收窄TS narrowing而不是靠强制类型转换去猜结构。例如同时处理创建与删除两种动作的结果if (created-row in result) { // result 被收窄为 ActionResultForCreate const newRowId result[created-row]; } else if (rows-deleted in result) { // result 被收窄为 ActionResultForDelete const deletedPKs result[rows-deleted]; console.log(Deleted rows with PKs: ${deletedPKs.join(, )}); }由于联合中的每个成员都有互不重叠的顶层键created-row、rows-updated、rows-deleted、success等这种基于in的收窄是类型安全的且能捕获拼错的字段名——这正是设计文档强调的避免 permissive 类型吞掉错误读取的意图。与其它动作响应类型的对比为了准确理解ActionResultForDelete的定位将它放在动作响应类型家族中对比类型适用场景关键字段ActionResultForCreate单行创建created-row新行的主键/值ActionResultForUpdate单行更新更新后行数据ActionResultForDelete单行删除rows-deleted: readonly RowValue[]被删主键ActionResultForBulk批量操作rows-created?/rows-deleted?/rows-updated?数字计数successActionResultForSql自定义 SQL查询式结果单行 vs 批量的本质区别单行删除关注删了哪条记录主键数组而批量删除只关心删了多少条数字计数rows-deleted?: number见ActionResultForBulk。设计上批量操作响应还带一个统一的success: boolean标志而单行变体则没有——成功与否由响应是否返回以及数组是否为空体现。在 Embedding SDK 中的使用场景useActionHookActionResultForDelete最常见的消费入口是 SDK 的useActionHookfunction useActionTParameters, TKind( actionId: SdkActionId | null, ): UseActionResultTParameters, TKind;关键用法要点actionId参数动作的数字 id 或其entity_id字符串类型见SdkActionId传null表示不绑定任何动作泛型TParameters约束execute调用时的参数对象泛型TKind显式指定动作种类如delete取值见ActionKind使result收窄为对应的精确类型如ActionResultForDelete省略时回退到AnyActionResult联合手动触发与查询类 Hook 不同useAction不会在挂载时自动执行必须在事件处理器中显式调用execute需要条件门控时在事件处理器内部先分支判断如if (!user.canEdit) return;再调用。一个删除场景的完整示例const { execute, result } useAction{ id: number }, delete(deleteActionId); // 在按钮点击事件中手动触发 const handleDelete async () { await execute({ id: rowId }); }; // 由于显式声明了 TKind deleteresult 已被收窄为 ActionResultForDelete if (result rows-deleted in result) { console.log(已删除主键${result[rows-deleted]}); }底层调用链从前端到 API从源码结构看动作执行的完整链路是SDK 层useAction封装对动作的触发与结果状态管理应用层frontend/src/metabase/actions/actions.ts 中的executeAction通过actionApi.endpoints.executeAction发起请求并调用getActionExecutionMessagefrontend/src/metabase/actions/utils.ts决定展示的成功消息类型层frontend/src/metabase-types/api/actions.ts 定义ExecuteActionRequest { id, parameters }其中id为WritebackActionId | BaseEntityId与 SDK 的SdkActionId语义对应后端隐式动作implicit action按kindrow/create、row/update、row/delete执行对应的写回操作删除场景返回rows-deleted主键数组。前端删除确认弹窗 DeleteObjectModal.tsx 同样复用executeAction完成删除并处理结果可作为理解该类型实际消费方式的参考实现。小结ActionResultForDelete是 Metabase Embedding SDK 动作体系中的一个小而精确的类型结构仅一个必填字段rows-deleted: readonly RowValue[]承载被删行的主键定位单行删除专属响应与批量响应的数字计数形成互补联动作为AnyActionResult判别联合成员配合useActionTParameters, TKind的TKind泛型或key in result收窄可在类型安全的前提下正确处理删除动作结果。掌握这个类型你就能在 Embedding SDK 集成中准确读取删除操作的返回值并写出可被 TypeScript 编译器校验的健壮代码。【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考