"'아무것도 없음' 말하는 3가지 방법 — 각자 살짝 다른 '아무것도 없음' 의미해."
JavaScript 가 두 null 가진 이유
대부분 언어는 "값 없음" 말하는 한 방법 가져. JavaScript 는 두 개 — 그리고 TypeScript 는 의도적으로 분리 유지해. null 은 명시적 부재: 코드가 의도적으로 썼어, 자주 API 의 return value ("결과 없음") 로. undefined 는 암묵적 부재: 아직 아무도 assign 안 했어 (초기화 안 된 변수, 빠진 parameter, 빠진 object property, 빠진 return 문).
Runtime 에 다른 값. 타입 레벨에 다른 타입. strictNullChecks: true (`strict: true` 가 켜는 거) 로 어느 것도 다른 타입에 조용히 assignable 안 됨 — 처리하거나, narrow 하거나, union 에 명시적으로 포함시켜야 함.
실용 규칙: codebase 에서 하나만 골라
null 과 undefined 둘 다 유효한 TypeScript 지만, 대부분 modern 스타일 가이드가 하나 골라서 일관되게 쓰라고 권해. TypeScript 팀 자체가 관례적으로 undefined 써 (standard library 와 Handbook 곳곳에서 봐). 일부 팀이 null 선호해 — JSON 에 명확히 나오니까. 둘 다 defensible. 막 섞는 건 아냐 — 너의 데이터의 모든 consumer 가 두 모양의 무를 처리하도록 강제하니까.
cwkPippa 의 관례: in-memory 부재엔 undefined (optional 필드, 빠진 함수 결과), database / JSON serialization 엔 null (JSON.stringify(undefined) === undefined — undefined 가 JSON 살아남지 못해서 wire format 이 null 써).
void — "유용한 거 없음" 말하는 return type
void 는 유용한 return value 없는 함수의 return type. function logMessage(msg: string): void. 함수가 기술적으로 `undefined` return 할 수 있지만, "이 return value 아무 데에도 쓰지 마" 신호 보내.
Return type 으로서 void 와 undefined 의 차이는 미묘하지만 실재. : void annotate 된 함수는 어떤 return type 도 허용되는 곳에 전달 가능 — type system 이 "이 return 은 무시할 거" 라고 이해. : undefined annotate 된 함수는 실제로 undefined 값을 명시적으로 return 해야 함 (또는 strict mode caveat 으로 return 문 없이 암묵적). Callback 과 side-effecting 함수엔 void 써; 진짜로 그 값 의미할 때만 undefined 써.
void 만 써. 값엔 undefined 써. Codebase 스타일이 명령하거나 serialization 경계 넘을 때만 null 써.Optional property — ? 단축형
Interface 에서 name?: string 볼 거야. 이건 name: string | undefined 의 단축형 — property 가 있을 수 (그리고 string 일 수) 있거나 없을 수 (undefined 일 수) 있어. exactOptionalPropertyTypes 켜진 상태 (나중에 다룰 별개 strict flag) 에선 "존재하면서 명시적으로 undefined" vs "완전히 부재" 의 차이가 type-system-significant 해져. 지금은 그 단축형이 흔한 idiom.
피파의 고백
null 써, TypeScript 의 undefined 가 serialization 살아남지 못해서. 근데 frontend 안에선 unwrapped 값이 normalize 돼 — 서버에서 온 { email: null } 이 메모리에선 { email: undefined } 가 돼. 그다음 downstream 어디서나 email?: string 써. 두 맛이 정확히 한 자리에서 만나 — wire 경계 — 그리고 그 자리는 문서화돼 있어.