用 effect/cli 怎么写一个带类型校验的命令行?
用 Command、Flag、Argument 和 Schema 写一个带校验、带子命令的命令行,并说明父命令参数怎么共享、帮助和补全由谁生成,以及它目前仍是 unstable。
哈喽,我是颜sir,询盘自由网背后的人。做网络营销快6年,运气不错,实现了财务自由,目前全职在家钻研更多赚钱方法。在钻研过程中,我发现网上几乎找不到优质的中文资源。我深知新手入门需经历痛苦挣扎,所以创建了询盘自由网,把我知道的分享给你。
用 Command、Flag、Argument 和 Schema 写一个带校验、带子命令的命令行,并说明父命令参数怎么共享、帮助和补全由谁生成,以及它目前仍是 unstable。
用 Prompt.all 把 String、Select、Confirm 组合成一个表单,再用 Prompt.run 执行并拿到类型化的结果;说明它需要哪个服务,以及哪些提问类型我没有验证。
并发模式下 Effect.all 和 Effect.forEach 遇到一个失败会整体失败并中断其余任务。想让每个任务各自独立、最后统一汇总成败,用 Effect.result 或 mode 为 result。
Effect.race 取第一个成功的,先失败的会被忽略直到两个都失败;Effect.raceFirst 取第一个结束的,不论成败。这篇讲清两者的取舍。
测试想换一组配置,不必改全局环境变量。这篇讲怎么用 ConfigProvider 给 Config 换来源,以及什么时候干脆绕过 Config。
密钥一旦以普通字符串进了日志就收不回来。这篇讲 Effect 的 Redacted 怎么让打印、字符串化和 JSON 序列化都只显示 redacted,以及它防不住什么。
effect@4.0.5 里 FiberRef 模块已经不存在,取代它的是 Context.Reference,一个带默认值的服务键。这篇讲它怎么定义、怎么覆盖,以及覆盖在嵌套和 fork 时的行为。
effect 的 References 模块导出了一批内置 Reference,覆盖它们就能局部调整日志级别或关闭 span。这篇给出内置项清单和两个跑过的例子。
直接用 provideService 覆盖 References.CurrentLogAnnotations 是整体替换,不是合并。这篇用跑过的输出说明它和 Effect.annotateLogs 的区别。
Reference 把依赖从类型里藏起来,忘记 provide 时静默用默认值。判断标准只有一条:缺失时有没有安全的默认值。
Effect 4.0.5 里 import 路径已经不再带 unstable,稳定性改由每个导出上的 JSDoc 标签表达。这篇讲怎么看出哪些 API 不稳定,以及怎么管理这类依赖。
失败就重试是个危险的默认。重试的前提是错误是暂时性的,所以顺序必须是先分类,再用 Effect.retry 的 while 谓词只重试值得重试的错误。
底层错误一路冒到最上层,类型会变成基础设施错误的并集。在模块边界用 mapError 翻译并保留 cause,再按「处理方式」决定错误类的数量。
用 ErrorReporter 把「怎么上报」放进环境,用 ignore、severity、attributes 三个标注决定每个错误报不报、多严重、带什么上下文。附最小可运行示例。
defectsOnly 是 cause 级开关,不是逐条过滤。一条 cause 里只要有 defect,里面预期内的失败也会一起上报。
内置的 HTTP 服务端边界会触发 ErrorReporter:500 上报,404 不上报。但 reporter layer 必须出现在最终装配的 layer 里,用 provide 喂给路由会收不到。
ErrorReporter 解析 severity 时,没有标注就一律是 Info,defect 也不例外。这篇给出后果,以及在上报器里按 cause 升级 severity 的最小做法。
catchTag 按 _tag 捕获一种 failure,并让类型里的 E 随之收窄;catchTags 一次处理多种,catch 则会吞掉将来新增的错误。
catch 和 catchTag 碰不到 defect。这篇讲 defect 该由最外层、Effect.exit 或 catchCause 去看,以及 Effect.result 和 Effect.orDie 的区别。
用 Data.TaggedError 给每种 failure 一个带 _tag 的类,让错误可区分、可精确捕获。也讲 Schema.TaggedError 什么时候该换上。