TypeScript
The type system as a design tool, not a syntax tax.
13 topics
Structural Typing & Assignability
TypeScript compares shapes, not names — the rule behind excess property checks, surprising compatibility, and most "why does this assign?" questions.
core25 minNarrowing & Control Flow Analysis
How TypeScript tracks what a value could be as code branches, and the guards that teach it something it cannot infer.
core25 minany, unknown, never & satisfies
The four type-system escape hatches and boundary markers, and which one to reach for when.
core20 minGenerics & Constraints
Type parameters as functions over types — where inference comes from, and why over-generic code is worse than concrete code.
core25 minConditional & Mapped Types
Types that branch and types that transform — the two constructs behind every utility type in the standard library.
deep25 minTemplate Literal Types & Key Remapping
Building and parsing string types at the type level, and renaming keys while mapping — the basis of typed event names and route params.
deep20 mininfer & Type-Level Programming
Extracting types from other types, recursive type computation, and knowing when to stop.
deep25 minUtility Types in Practice
The built-in helpers worth knowing by heart, the ones that are traps, and how to compose them.
core20 minBranded Types & Domain Modelling
Making the type system distinguish a UserId from an OrderId, and encoding invariants so illegal values cannot be constructed.
deep20 minTyping React
Props, children, refs, events and generic components — the patterns that come up daily and the ones that are now legacy.
core25 minDeclaration Files & Module Augmentation
Typing untyped packages, extending library types, and declaring the non-JavaScript things a bundler lets you import.
deep20 mintsconfig, Strictness & Project References
The compiler flags that actually change safety, and how to keep type-checking fast in a large or multi-package codebase.
core25 minRuntime Validation & Parse, Don't Validate
Types vanish at runtime, so anything crossing a boundary needs a real check — done once, at the edge, producing a known type.
core25 min