About
What this is
One TypeScript type puzzle a day, the same puzzle for everyone, rolling over at midnight UTC. Fill in the blank until every check passes. Nothing runs — the whole puzzle is resolved by the type checker, in your browser.
Difficulty ramps across the week: Monday rebuilds something from the standard library, Friday asks you to do arithmetic with tuple lengths. The annotated solution to each puzzle publishes once it stops being the daily, and stays up permanently.
How par works
Par is how many times a competent solver should need to run the checks. Every run costs a stroke, and so does revealing the hint. Solve it in fewer strokes than par and you are under; it is the same arithmetic as golf, and the same small pleasure.
Why type-level
A check passes only when your type is exactly the expected type — not merely assignable to it. That distinction is the whole game: an intersection of two object types can be assigned to the flattened object, but it is not the same type, and this harness knows the difference.
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
What’s coming
Accounts, global score distribution and the shortest-solution board are next. After that, the Type Atlas: one concept, many languages, with runnable experiments — how null, money, time and text are modelled differently by every system that claims to model them.