About
What this is
One TypeScript type puzzle a day, shared by everyone and refreshed at midnight UTC. Fill in the blank until every check passes. The TypeScript compiler checks your code in your browser without executing it.
Each annotated solution becomes available when the puzzle stops being the daily. Past puzzles remain playable in the archive, and you can filter them by concept and difficulty in Practice.
How par works
Par is the target number of strokes. Each check run costs one stroke, and revealing a hint costs another. Solve in fewer strokes than par to finish under par. There is no time limit.
Why type-level
Checks compare your result with the expected type using the equality helper below. Assignability alone does not pass: an intersection of object types can be assignable to a flattened object while this helper reports them as different.
type Expect<T extends true> = T type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false
Keep learning
Work through the lessons, experiment in the Lab, or look up a utility type, compiler error or reusable pattern. Puzzles and lesson progress work without an account and are saved on this device.

