strict turns on a family of checks at once, and you can switch any member off individually. Per the TSConfig reference it covers:
strictNullChecks:nullandundefinedstop being members of every type. They get their own types, sostringno longer accepts them.noImplicitAny: an untyped parameter or binding that cannot be inferred is an error instead of silentlyany.strictFunctionTypes: function parameters are compared contravariantly. It applies to function-typed properties, not to method syntax.strictBindCallApply:call,bindandapplycheck their arguments against the target function.strictPropertyInitialization: a class property must be assigned in the constructor or be typed to allowundefined. It requiresstrictNullChecks.noImplicitThis,useUnknownInCatchVariables(catch variable isunknown),strictBuiltinIteratorReturn(built-in iterators returnundefined, notany) andalwaysStrict(parse as ES strict mode and emit"use strict").
strictNullChecks is the important one because it removes the most common runtime crash class: "cannot read properties of undefined". Without it, array.find(...) is typed as returning the element, Map#get returns the value, and optional fields look always present, so the compiler certifies code that throws. With it, every place a value might be absent is visible in the type and you must narrow before use. The other flags tighten how types relate; this one changes what the types mean.
Version note. Before TS 6.0, strict defaulted to false. TS 6.0 made it true by default and TS 7.0 kept that, so a tsconfig without strict is now strict. The reference also warns that future versions may add checks under strict, so upgrades can surface new errors.
For a new project I leave strict on. For a legacy codebase I enable the flags one at a time, strictNullChecks and noImplicitAny first, rather than flipping everything in one commit.