Learn how to avoid the ‘Pyramid of Doom’ and method chaining limitations by embracing functional composition. We explore how pipe and flow allow you to build complex logic from small, testable pure functions.
Learn how to wrap missing data and expected errors in type-safe containers. We explore the Option and Either monads, providing the final foundational step before entering the Effect-TS ecosystem.
Learn how to eliminate impossible states from your application by mastering Algebraic Data Types (ADTs). We explore Sum Types, Product Types, and exhaustive pattern matching in TypeScript.
Functional programming requires data to be immutable. Discover how to leverage TypeScript’s structural typing, Readonly<T>, and as const to enforce deep immutability at compile time, eliminating a massive category of state-based bugs.
Welcome to the final module! Before diving into Effect-TS, we must build a foundation in Functional Programming. Learn why pure functions eliminate whole classes of bugs, how separating descriptions from execution powers the Effect runtime, and how to refactor impure services into highly testable functional pipelines.
An advanced masterclass in TypeScript type-level metaprogramming. Master conditional types (T extends U ? X : Y), distributive behavior, infer keyword pattern matching for unwrapping types, template literal types (${T}_${U}), and deep recursive object transformations.
An in-depth guide to intermediate TypeScript type transformations. Master generic functions and constraints (extends), indexed access types, keyof/typeof operators, built-in helpers (Pick, Omit, Record, ReturnType), and mapped type transformations.
The foundational guide to mastering TypeScript. Learn how the type inference engine works, master type narrowing with typeof, instanceof, in, and custom type predicates (is), build type-safe discriminated unions, and use as const assertions.
An exhaustive breakdown of TypeScript’s 7 primitive types. Learn how TS handles floating-point numbers, BigInts, symbols, strictNullChecks, and the critical structural differences between lowercase primitive types and uppercase Object wrappers.