怎么让 Effect 语言服务对 unstable API 报警告?

Effect 4.0.5 的稳定性只写在每个导出的 JSDoc 标签上,标签是注释,编辑器默认不会提醒你正在用 unstable 的 API。

用 Effect 语言服务的 tsgo 版本(@effect/tsgo),打开 unstableApiUsage 与 experimentalApiUsage 两条诊断,再用 allowedUnstableApis、allowedExperimentalApis 把接受风险的用法显式写进 tsconfig。

先交代边界:下面的内容来自 @effect/tsgo 的 README 与相关 PR,我没有在本地运行它,因为它需要 TypeScript 7 的原生编译器。另外我装了 npm 上的 @effect/language-service@0.87.5,在其 README、schema 与 index.js 里没有找到这些规则,所以别想当然地认为旧版语言服务插件有它们。标签本身是什么,见 Effect v4 怎么标注 API 的稳定性?。

有哪些相关的诊断和配置项?

README 里的相关项:

  • unstableApiUsage:使用了标注 @stability unstable 的 API 时警告。
  • experimentalApiUsage:使用了标注 @stability experimental 的 API 时警告。
  • apiStabilityLeak:面向库维护者,报告公开签名暴露了稳定性更低类型的导出。默认关闭。
  • allowedUnstableApis、allowedExperimentalApis:放行名单,默认空数组。

放行名单怎么写?

模块路径(如 effect/http)放行该模块及其子模块;模块#导出名 只放行单个导出,大小写敏感且按路径段匹配,所以 effect/http 不会放行 effect/http-api。README 示例的配置形态是:

{
  "compilerOptions": {
    "plugins": [
      {
        "name": "@effect/language-service",
        "diagnostics": true,
        "allowedUnstableApis": ["effect/http", "effect/rpc/RpcClient#make"],
        "allowedExperimentalApis": []
      }
    ]
  }
}

我会怎么用它?

这是我的推论,不是实测过的做法:

  1. 默认让两条规则保持警告,团队里每个 unstable 用法都会被看见。
  2. 对决定接受风险的模块,在放行名单里显式写入,等于在 tsconfig 里留下一份「我们依赖的 unstable 清单」,升级前逐条检查 changelog。
  3. 放行粒度尽量用 模块#导出名,而不是整个模块,避免顺手放行更多 API。
  4. 发布库时打开 apiStabilityLeak:你的公开类型里如果出现了 unstable 类型,你的使用者就间接依赖了它,你的 semver 承诺也就悬空了。

有已知问题吗?

tsgo 仓库里有一个 issue(#833)报告同时开启这两条规则时可能出现多余的 TS2488、TS2698 错误。我没有复现,升级前请先查它的状态。

没有语言服务时怎么办?

可以用下面的 bash 先粗略盘点你实际 import 了哪些子路径,再对照 Effect 4.0.5 里哪些模块仍是 unstable? 的清单:

grep -rhoE 'from "effect/[^"]+"' src | sort | uniq -c | sort -rn

注意这只能看到模块层面。Effect 这类 stable 模块里也夹着个别 unstable 的声明,只靠 import 路径看不出来。

本文的诊断名、配置项与放行名单规则取自 @effect/tsgo 的 README 与相关 PR,我没有在本地运行过 @effect/tsgo,示例配置也没有验证。我检查过 @effect/language-service 0.87.5 的 README、schema 与 index.js,其中没有这些规则。使用建议是我的推论。issue #833 的现状没有核对。