Effect CommunityEC
Effect Community3y ago
9 replies
mw10013

Assignability of `Effect.Effect<never, never, number>` and `Effect.Effect<never, Error, never>` t...

Why are Effect.Effect<never, never, number> and Effect.Effect<never, Error, never> assignable to Effect.Effect<never, Error, number>?

This is probably more of a beginner Typescript question, but still would appreciate any guidance. In https://effect.website/docs/essentials/creating, there is the divide example.

import { Effect } from "effect"
 
const divide = (a: number, b: number): Effect.Effect<never, Error, number> =>
  b === 0
    ? Effect.fail(new Error("Cannot divide by zero"))
    : Effect.succeed(a / b)


It has an explicit return type of Effect.Effect<never, Error, number. If I remove the return type, Typescript seems to infer the return type as Effect.Effect<never, Error, never | Effect.Effect<never, never, number

Typescript seems to accept below without squiggles.

const d1: Effect.Effect<never, Error, number> = Effect.fail(
  new Error("Cannot divide by zero")
);
const d2: Effect.Effect<never, Error, number> = Effect.succeed(42);


Wondering why these are assignable. Also, is it customary using Effect to provide explicit return types? What are the trade-offs letting Typescript infer the return type?
Was this page helpful?