any disables type checking; unknown is a type-safe counterpart that must be narrowed before use; never represents values that can never occur (functions that throw/loop forever, or exhausted unions).
any is an escape hatch that turns off all checking — it spreads through your code and reintroduces runtime bugs, so it's discouraged. unknown accepts any value but forbids using it until you narrow (typeof/instanceof/assertion), making it the safe choice for JSON, catch clauses (catch (e: unknown)), and library boundaries. never is the empty type: it's the return type of a function that never returns, the type of a variable in an impossible branch, and the key to EXHAUSTIVENESS checks — assigning a narrowed value to a never variable in a switch's default forces the compiler to error if you add a new union member you didn't handle.
A safe catch: try { ... } catch (e: unknown) { if (e instanceof Error) console.log(e.message) } — TypeScript forces you to check before touching e, preventing 'e is of type unknown' bugs.
How can never help you guarantee you've handled every case of a union like type Status = 'pass' | 'fail' | 'skip'?