mcpField
E
effect-ts-fundamentals

effect-ts-fundamentals

github.com/mrevanzakDevelopment897 installsUpdated 40w ago
Repository

About effect-ts-fundamentals

A skill guide to Effect-TS fundamentals for developers building complex TypeScript applications. It covers typed effects, dependency injection, and safe composition of asynchronous work.

Key features

  1. 01Generator-based effect composition
  2. 02Type-safe service definitions
  3. 03Layer-based dependency injection
  4. 04Declarative asynchronous pipelines

Use cases

  1. 01Structuring complex TypeScript applications
  2. 02Composing dependent asynchronous operations
  3. 03Decoupling services from implementations

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/mrevanzak/effect-ts-skills --skill effect-ts-fundamentals

After installing, type/effect-ts-fundamentalsin Claude Code to confirm it loaded.

Details

From the project README

Effect-TS Fundamentals

Overview

Effect-TS provides a unified toolkit for building robust applications by treating side effects as values. It enables type-safe error handling, dependency injection, and resource management.

When to Use

  • When building complex TypeScript applications requiring strict error tracking.
  • When you need to decouple implementation from interface via dependency injection.
  • When managing multiple async operations that must be composed safely.

When NOT to use:

  • Simple scripts where standard Promise and try/catch suffice.
  • Projects where team overhead for learning Effect outweighs architectural benefits.

Core Pattern

Effect replaces manual dependency passing and nested try/catch with a declarative, generator-based flow.

Before (Plain TS):

async function getUserData(userId: string, db: Database) {
  try {
    const user = await db.findUser(userId);
    const posts = await fetchPosts(user.id);
    return { user, posts };
  } catch (e) {
    throw new Error("Failed");
  }
}

After (Effect):

const getUserData = (userId: string) =>
  Effect.gen(function* () {
    const db = yield* DatabaseService;
    const user = yield* db.findUser(userId);
    const posts = yield* fetchPosts(user.id);
    return { user, posts };
  });

Quick Reference

FeatureToolPurpose
Sequential LogicEffect.genReadable async pipelines
Service DefinitionEffect.ServiceType-safe DI containers
Layer CompositionLayer.merge/provideWiring dependencies

Implementation

1. Modern Service Pattern

Define services with built-in accessors for seamless dependency injection.

export class UserService extends Effect.Service<UserService>()("UserService", {
  accessors: true,
  effect: Effect.gen(function* () {
    const db = yield* DatabaseService;
    return {
      getUser: (id: string) => db.query(`SELECT * FROM users WHERE id = ${id}`)
    };
  }),
  dependencies: [DatabaseService.Default]
}) {}
2. Sequential Logic with Generators

Use Effect.gen and yield* to compose effects without callback hell or manual promise chaining.

const getUserData = (userId: number) =>
  Effect.gen(function* () {
    const user = yield* fetchUser(userId);
    const posts = yield* fetchUserPosts(user.id);
    return { user, posts };
  });
3. Layer-Based Dependency Injection

Compose implementation layers and provide them to your program.

const MainLayer = Layer.merge(DatabaseService.Default, LoggerService.Default);
const program = pipe(myEffect, Effect.provide(MainLayer));

Common Mistakes

  • Forgetting yield*: Calling an effect without yield* inside Effect.gen returns the effect itself, not its value.
  • Manual try/catch: Use Effect.try or Effect.catchTag instead of standard try/catch to keep errors in the type channel.

REQUIRED SUB-SKILLS:

  • effect-ts-errors for advanced error handling.
  • effect-ts-resources for safe resource management.

Comments

Markdown supported