根本原因是ts语言服务未加载effect类型定义,需在tsconfig.json的"types"字段显式声明["@effect/io", "@effect/data"],并确保使用工作区typescript版本、重启ts server。

Effect TS 的类型提示和 pipe 链式推导在 VSCode 里不工作,根本不是插件或编辑器问题,而是 TypeScript 语言服务没加载 Effect 的类型定义——哪怕你装了 @effect/io,VSCode 默认也“看不见”它。
为什么 Effect.succeed 写出来就报 Cannot find name 'Effect'
VSCode 不会主动扫描 node_modules/@effect/io 下的 index.d.ts,尤其当你还没在当前文件 import 过任何 Effect 符号时,整个模块类型系统处于“休眠”状态。
- 最直接的临时解法:在任意 .ts 文件顶部加一行
import * as Effect from "@effect/io"(哪怕后续删掉),强制触发类型加载 - 更稳妥的长期方案:在
tsconfig.json的"types"字段中显式声明:"types": ["@effect/io", "@effect/data"] - 绝对不要用
/// <reference types="@effect/io"></reference>—— VSCode 对三斜线引用的支持在 monorepo 或多配置场景下极不稳定
pipe 中间类型变 any,map/flatMap 补全消失
Effect v3+ 的 pipe 依赖 TypeScript 5.0+ 的泛型链式推导能力,但 VSCode 的 TS 语言服务在处理长链(尤其是混用 Effect/Option/Either)时容易超时或缓存失效,导致类型“塌缩”。
- 确保
tsconfig.json启用了完整 strict 模式:"strict": true,且 TypeScript 版本 ≥ 5.0(检查node_modules/typescript,别信 VSCode 状态栏显示的 “Bundled” 版本) - 必须点击状态栏右下角的 TS 版本号 → 选 “Use Workspace Version”,否则语言服务跑在旧版 TS 上,Effect 的高级类型根本无法解析
- 每次改完
tsconfig.json或装完新包后,手动执行Ctrl+Shift+P→ “TypeScript: Restart TS Server”,否则编辑器继续用错误缓存
要不要装 @effect/language-service 插件
要,但前提是基础 TS 配置已跑通。这个 LSP 插件不是“替代” TypeScript 类型检查,而是叠加一层 Effect 语义诊断(比如提示 Effect.log("x") 必须被 runPromise 或赋值)。
- 安装命令(以 pnpm 为例):
pnpm add -D @effect/language-service - 必须在
tsconfig.json中添加插件配置:"plugins": [{ "name": "@effect/language-service" }] - 它不会修复类型推导失败的问题,但能帮你发现“写对了语法却忘了运行”的逻辑疏漏——这类错误纯靠 TS 类型系统是抓不到的
Effect 的类型系统不是“开箱即用”的黑盒,它和 TypeScript 的配置深度耦合。最容易被忽略的点是:你以为装了包就万事大吉,其实 VSCode 根本没让 TS 语言服务加载那些类型定义;你以为改了 tsconfig.json 就立刻生效,其实编辑器还在用旧缓存跑。这两步不手动确认,后面所有调试、补全、推导都会失准。











