tsconfig
One page per option. Each carries a snippet compiled twice, once with the option off and once with it on, and the exact diagnostics each run produced — checked by the build, not by us.
Every before and after on these pages is compiled both ways at build time
The scope is the options that change what the type checker accepts. Emit options — target, module, jsx, declaration — change what comes out rather than what is allowed; proving those means comparing generated JavaScript, which is a different verifier and is not here yet. Half-checked pages are worse than absent ones.
Under strict
strictSince 2.3TS18047Not an option so much as a subscription: it turns on eight other checks, and keeps turning on the ones added after you wrote your tsconfig.
strictNullChecksSince 2.0In strictTS18047Without it, `null` and `undefined` are members of every type, so `string` silently means "string, or nothing at all".
noImplicitAnySince 1.6In strictTS7006A parameter the compiler cannot infer becomes `any` — this makes it say so instead.
strictFunctionTypesSince 2.6In strictTS2322A function that accepts less cannot stand in for one that must accept more — obvious when stated, and unchecked without this flag.
strictBindCallApplySince 3.2In strictTS2345Without it, these three accept any arguments at all, because their declared types say `any[]`.
strictPropertyInitializationSince 2.7In strictTS2564Declaring `token: string` says the property is a string. Before this flag, nothing checked that it ever became one.
noImplicitThisSince 2.0In strictTS2683Inside a plain nested function, `this` is not the object you wrote it in — and without this flag it is silently `any`.
useUnknownInCatchVariablesSince 4.4In strictTS18046JavaScript can throw anything — a string, undefined, a number — so a caught value is `unknown` rather than `any`.
Soundness, not under strict
noUncheckedIndexedAccessSince 4.1Not in strictTS2322Reading a key that was never written gives `undefined` at runtime. This is the flag that says so in the type.
exactOptionalPropertyTypesSince 4.4Not in strictTS2375`{ retries?: number }` normally also permits `{ retries: undefined }`. This flag makes the question mark mean only "may be absent".
noPropertyAccessFromIndexSignatureSince 4.2Not in strictTS4111Reserves `obj.key` for properties that were actually declared, and pushes everything from an index signature to `obj["key"]`.
noImplicitOverrideSince 4.3Not in strictTS4114Requires the `override` keyword on any member that replaces one from the base class.
Dead code and unused names
noImplicitReturnsSince 2.0Not in strictTS7030A function where some branches return a value and others fall off the end is almost always a missing case.
noFallthroughCasesInSwitchSince 1.8Not in strictTS7029Flags a `case` that does work and then runs into the next one, while still permitting the deliberate empty fallthrough.
noUnusedLocalsSince 2.0Not in strictTS6133An unread local is usually the leftover of a change that was only half made.
noUnusedParametersSince 2.0Not in strictTS6133Reports parameters that are declared and never read, with a leading underscore as the documented way to say you meant it.
allowUnreachableCodeSince 1.8Not in strictTS7027Set it to `false` — the default only warns in the editor, and a warning is not a build failure.
allowUnusedLabelsSince 1.8Not in strictTS7028An unused label is usually not a label at all — it is an object literal or a type annotation that parsed as one.
Modules and emit shape
verbatimModuleSyntaxSince 5.0Not in strictTS1484An import used only as a type must be written `import type`, so the emitted JavaScript is what the source shows.
isolatedModulesSince 1.5Not in strictTS1205Rejects the constructs that cannot be compiled correctly without looking at other files — which is how every fast bundler compiles.
erasableSyntaxOnlySince 5.8Not in strictTS1294Bans the TypeScript constructs that emit runtime code — enums, namespaces, parameter properties, `declare` class fields.
noUncheckedSideEffectImportsSince 5.6Not in strictTS2882`import "./styles.css"` was never checked to resolve at all, so a typo in one was invisible.

