怎么用 TestSchema.Asserts 测 Effect Schema?
effect/testing 里的 TestSchema.Asserts 专门测 Schema:断言解码、编码、往返和生成器。这篇讲每个方法做什么,以及怎么搭进 vitest。
哈喽,我是颜sir,询盘自由网背后的人。做网络营销快6年,运气不错,实现了财务自由,目前全职在家钻研更多赚钱方法。在钻研过程中,我发现网上几乎找不到优质的中文资源。我深知新手入门需经历痛苦挣扎,所以创建了询盘自由网,把我知道的分享给你。
effect/testing 里的 TestSchema.Asserts 专门测 Schema:断言解码、编码、往返和生成器。这篇讲每个方法做什么,以及怎么搭进 vitest。
RateLimiter 是 effect/persistence 提供的按 key 限速服务。这篇讲清它的 consume 参数、两种算法、delay 与 fail 的区别,以及内存和 Redis 两种存储。
熟悉 CountDownLatch 的人容易误会 Effect v4 的 Latch。它其实是一个可反复开关的闸门,这篇讲清 open、close、release、whenOpen 的语义。
普通 Semaphore 先到先得,一个租户灌入大量任务会堵住所有人。PartitionedSemaphore 共享一个许可池,按分区 key 在等待者之间轮转分配。
并发上限、速率上限、循环节拍是三件不同的事,Effect 里分别对应 Semaphore、RateLimiter 和 Schedule。这篇给出选型顺序和叠加方式。
用 Request.Class、RequestResolver 和 Effect.request,调用方仍然一个 id 查一次,底层合并成一次查询。附带 setDelay、batchN、makeGrouped、withCache 的用法。
Cache.makeWith 的 timeToLive 接收查找结果的 Exit,成功缓存十分钟、失败只缓存五秒。附 TestClock 验证写法,以及 RequestResolver.asCache。
请求错开几毫秒到达时默认各自成批。用 setDelay 加收集窗口,用 batchN 限制批大小,用 makeGrouped 按 key 分组。
ScopedCache 的条目过期是惰性的:过期后没有再被访问,finalizer 不会执行。用 TestClock 逐步演示 open、close 的顺序。
Effect 里登记资源清理有三种写法。这篇讲它们各自适合的场景,以及怎么看类型里的 Scope 判断资源有没有人负责。
Effect.acquireRelease 的获取步骤默认不可中断,释放步骤也不会被中断,释放还不能有可预期的失败。这篇讲这些保护是什么、为什么这样设计。
Schedule.cron 接受五段 cron 表达式,算出距离下一次触发还要等多久。它读的是 Clock,所以能被 TestClock 驱动,不用真等到整点。
把「业务代码不写 try/catch、run 只在入口」这类约定变成退出码非 0 的命令,关键在三个设计:一个规则一个 owner、合同与生成物分离、信号与阻断分开。以 @yansircc/effect-scan 为例。
Schema 默认遇到第一个错误就停,表单类接口需要把所有字段的问题一起交给调用方。这篇讲 errors "all" 选项,以及怎么把 SchemaError 压平成带路径的领域错误。
用 Effect v4 的 Schema.TaggedUnion 一次定义订单这类多状态数据,自带解码、match、guards 和穷尽检查。这篇讲定义写法和三个工具各检查什么。
Effect v4 里给结构加身份有三种工具,运行时行为差别很大:TaggedClass 的守卫是 instanceof,Opaque 默认不是名义类型且只能包 Struct。这篇讲清各自的边界和选择标准。
状态和事件各用一个 TaggedUnion,转换写成 match 加 guards 的纯函数,非法转换变成显式失败值。这篇给出完整代码,并说明同一份定义怎么导出落库格式和 JSON Schema。
已经有成员 Schema,或者判别字段不叫 _tag,就用 Schema.toTaggedUnion 给普通 Union 加上 match、guards 和 discriminants。这篇讲用法、判别值重复和嵌套联合的行为。
Effect v4 里一份 Schema 可以派生 Standard Schema、JSON 编解码器、JSON Schema、Equivalence、Formatter 和 JSON Patch。这篇逐个讲它们各解决什么、边界在哪。
withDecodingDefaultKey 的默认值是产出 Encoded 值的 Effect,不是 thunk,也不是 Type 值,而且每次解码都会重新求值。这篇把四个坑和对应写法讲清楚。