Skip to main content
The Effect Language Service augments TypeScript’s built-in completion list with Effect-aware snippets. These completions fire in specific syntactic positions — typically inside extends clauses, after a . accessor, or inside a comment — and insert ready-to-use boilerplate with tab stops.
All completions work in both Effect V3 and V4 unless noted otherwise.

Class extends completions

These completions trigger when your cursor is inside the extends clause of a class declaration. They insert the full parent-class call, including the self-referencing type parameter and deterministic tag key.

contextSelfInClasses

Inserts a Context.Tag("key")<ClassName, Shape>(){} snippet when you dot-access Context in an extends clause. Support: V3 ✓ · V4 ✗

effectSelfInClasses

Inserts an Effect.Service<ClassName>()("key", { ... }){} or Effect.Tag("key")<ClassName, Shape>(){} snippet when you dot-access Effect in an extends clause. Support: V3 ✓ · V4 ✗

serviceMapSelfInClasses

Inserts a ServiceMap.Service<ClassName, {}>()( "key"){} or factory-based ServiceMap.Service<ClassName>()( "key", { make }){} snippet when you dot-access ServiceMap in an extends clause. Support: V3 ✓ · V4 ✓

effectDataClasses

Inserts a Data.TaggedError("ClassName")<{}>{} or Data.TaggedClass("ClassName")<{}>{} snippet when you dot-access Data in an extends clause. Support: V3 ✓ · V4 ✓

effectSchemaSelfInClasses

Inserts schema class constructor snippets when you dot-access Schema (or Model in V4) in an extends clause. The available variants depend on your Effect version. Support: V3 ✓ · V4 ✓

rpcMakeClasses

Inserts an Rpc.make("ClassName", { ... }){} snippet when you dot-access Rpc from @effect/rpc in an extends clause. Support: V3 ✓ · V4 ✗

Dot-access completions

genFunctionStar

Inserts a gen(function*(){}) snippet when you type .gen after any object that has a callable gen property — for example Effect, Micro, or any custom object with a compatible gen method. Support: V3 ✓ · V4 ✓

schemaBrand

Inserts a brand("varName") snippet when you dot-access Schema inside a variable declaration initializer. The variable name is automatically inferred from the enclosing declaration. Support: V3 ✓ · V4 ✗

Comment directive completions

effectDiagnosticsComment

Inserts an @effect-diagnostics ruleName:severity or @effect-diagnostics-next-line ruleName:severity directive snippet when you type @ inside a //, /*, or /** comment. All diagnostic rule names and severity levels are offered as choices. Support: V3 ✓ · V4 ✓

effectCodegensComment

Inserts an @effect-codegens codegenName directive snippet when you type @ inside a comment. All available codegen names are offered as tab-stop choices. Support: V3 ✓ · V4 ✓

Codegens

Codegens are comment-directive-driven code generators. You annotate a declaration with an @effect-codegens comment and the language service inserts boilerplate into the file. All three codegens are planned but not yet implemented.
Codegens are not yet available. The completion for @effect-codegens (above) inserts the directive, but no code is generated from it in the current release.
When implemented, usage will look like this:

Rename extensions

keyStrings

Extends TypeScript’s rename operation to also update key string literals inside Effect class declarations (e.g., the tag key string "MyService" when you rename the class MyService). This feature is planned but not yet implemented.
keyStrings rename extension is not yet available in the current release.