SuperAPI AI 工具集

requirements

编程与开发

查看项目

更新于 10-15 19:56

技能介绍

用途:该技能面向 Effect(TypeScript 函数式效果库)中的依赖注入与需求管理,帮助理解 Effect<Success, Error, Requirements> 第三个类型参数 R 的含义——即运行该 effect 所需的 Context 服务。核心动机是可测试性:所有外部依赖(API 调用、数据库、文件系统、第三方 SDK)都应包装为 Context.Tag 服务,测试时用测试实现替换,从而在不触达真实系统的前提下获得完整测试覆盖。

主要能力:定义服务可用 Effect.Tag(推荐,接口与标签写在一起)或直接 Context.Tag;在 Effect.gen 中通过 yield* 获取服务。创建 Layer 的方式包括 Layer.succeed(简单值)、Layer.effect(基于 effect 构造)、Layer.scoped(带生命周期的资源,如数据库连接池)、Layer.function(由函数生成)。注入依赖用 Effect.provide 提供 Layer,或用 Effect.provideService 提供单个服务。组合 Layer 可用 Layer.merge、Layer.provide、Layer.provideMerge、Layer.mergeAll,按基础设施→仓库→服务的自底向上方式搭建应用层。Layer 默认带记忆化,可用 Layer.fresh 关闭;Effect 还内置 Clock、Random 等默认服务,可用 TestClock.layer 覆盖。

测试用法:每个服务都应提供测试 Layer。无状态服务用 Layer.succeed;有状态服务(如仓库)用 Layer.effect 配合 Ref 维护状态。测试 Layer 可用 Layer.mergeAll 组合,并配合 @effect/vitest 的 layer 与 it.effect 使用,也可与属性测试(Arbitrary.make)结合,由服务层控制 I/O、Arbitrary 生成数据。

适用场景与限制:适用于使用 Effect 构建、需要依赖注入与高测试覆盖的 TypeScript 项目。资料强调必须为每个服务创建测试 Layer、所有外部依赖都要经过服务封装、资源用 Layer.scoped 保证清理、命名约定 *Live 与 *Test。更完整的文档需查阅 ${CLAUDE_PLUGIN_ROOT}/references/llms-full.txt 中的相关章节。