Start here. This is the direct spoken answer to practice first.
Overview
The first question is whether the value is legitimately absent, not yet available, explicitly empty, or invalid at the boundary.
With strict null checking, null and undefined are distinct types that must be handled before using the value. An optional property may be absent and is read as possibly undefined; value: T | null says the property exists but may explicitly contain null. I model the real states and narrow them with a check, discriminated union, or validation rather than adding !.