"Type-level ternaries. The compiler computes types the way you compute values."
The shape
A conditional type has the form T extends X ? A : B. It evaluates at the type level: if T is assignable to X, the type is A; otherwise B. The extends here is the same structural-assignability check used in generic constraints.
Conditional types are how the standard library expresses computed types — ReturnType, Parameters, Awaited, NonNullable are all conditional types under the hood. Once you can read them, you can read most of TypeScript's advanced type library.
The distribution rule (preview)
When the checked type (the T) is a naked generic parameter, conditional types distribute over unions. type Wrap<T> = T extends unknown ? { value: T } : never applied to string | number distributes: Wrap<string> | Wrap<number> = { value: string } | { value: number }. We covered this in track 6; the same rule applies here.
The bracket trick ([T] extends [X]) disables distribution when you need it. Use this for yes/no checks where the union shouldn't be split.
Composing conditionals
You can chain conditionals: type Classify<T> = T extends string ? 'str' : T extends number ? 'num' : 'other'. Read like a multi-arm switch — each : T extends ... is the next case.