"JavaScript 가 뭐든 throw 가능. TypeScript 가 catch 를 `unknown` 으로 타입해서 그 사실 처리하게."
Unknown catch parameter
JavaScript 가 `throw 'string'`, `throw 42`, `throw { custom: 'object' }`, `throw new Error(...)`, 또는 다른 값 허용. Catch block 이 도착한 어떤 모양이든 처리해야. Strict mode 의 `useUnknownInCatchVariables` flag (modern 프로젝트에 default 켜짐) 와 함께, catch parameter 의 타입이 `unknown`, property 접근 전 narrow 강제.
패턴: catch (e) { if (e instanceof Error) console.log(e.message); else console.error('unknown error', e); }. Narrowing 이 접근 안전하게.
왜 async 에 더 중요
Promise rejection 도 타입 안 붙음. fetch().then(...).catch(e => ...) — `e` 가 reject 된 어떤 거든, 뭐든 될 수. async/await 가 이걸 try/catch 로 데려오고, 거기서 unknown 규칙 발동. Strict mode 없으면 `e.message` 쓰고 string-throwing API 에 조용히 크래시.
더 풍부한 narrowing 용 커스텀 error class
Throw 할 때 Error 확장 선호: class NetworkError extends Error { constructor(public status: number) { super() } }. 그다음 `instanceof NetworkError` 로 narrow 해서 타입 붙은 필드 접근. Error 계층에 적용된 같은 이전 discriminated-union 패턴.