"strict": true en tsconfig.json activa de una sola vez una familia de comprobaciones más estrictas. Es muy recomendable para todos los proyectos nuevos: detecta los errores que TypeScript existe para prevenir.
// strictNullChecks — null/undefined are no longer assignable to everything
let name: string = null; // ❌ Error (without strict this compiles, then crashes)
function f(u?: User) { u.name; } // ❌ u is possibly undefined → forces a check
// noImplicitAny — parameters with no inferable type must be annotated
function g(x) {} // ❌ Error: 'x' implicitly has type 'any'
// strictPropertyInitialization — class fields must be initialized
class C { name: string; } // ❌ must init in constructor or mark optional
strictNullChecks es el más importante: separa null/undefined de los demás tipos, de modo que el compilador te obliga a manejar el "podría estar ausente" en todas partes, eliminando la causa número uno de errores en tiempo de ejecución ("cannot read property of undefined").
Activa los flags de forma incremental (strictNullChecks primero), corrige los errores archivo por archivo, en lugar de habilitarlo todo de golpe en un proyecto heredado grande.
Sin el modo estricto, TypeScript todavía permite muchos de los patrones inseguros que se supone debe prevenir (any implícito, valores nulos sin comprobar).
El modo estricto es donde TypeScript aporta la mayor parte de su valor: trátalo como el valor por defecto y relaja flags individuales solo con una buena razón.