"Null 이 자기 타입. Undefined 도. 너가 허용 안 하면 다른 타입에 몰래 안 들어가."
뭐 바꿔
`strictNullChecks` 없으면 `null` 과 `undefined` 가 모든 타입에 assignable. `string` 변수가 비밀리에 `null` 가질 수. `User` 반환하는 함수가 비밀리에 `null` 반환할 수. Type system 이 'string' 말하는데 현실이 'string-or-null' 말하고, 불일치가 모든 NullPointerException 숨김.
Flag 켜지면 `null` 과 `undefined` 가 자기 타입. 허용하는 어떤 union 에든 명시적으로 포함해야. `string | null` 이 null 받음; `string` 안 받음. Type system 이 마침내 진실 말함.
Fix 의 cascade
Legacy codebase 에 strictNullChecks 켜면 조용히 null 허용한 모든 곳 노출. Fix 가 카테고리:
- 타입 명시: `string` → `string | null`.
- 쓰기 전 narrow: `if (x !== null) { ... x 를 string 으로 써 ... }`.
- Compiler 보다 잘 알 때 non-null assertion `!` 사용 (아껴서).
- Nullability 완전 제거하도록 refactor.
`strictNullChecks` 가 noImplicitAny 다음으로 두 번째로 큰 impact strict flag. 결합, 그 두 flag 가 실제 codebase 의 latent 타입 안전 부족 대부분 잡음.