기본 패턴
ts
let raw: unknown = JSON.parse("{}");
if (typeof raw === "object" && raw !== null) {
console.log(raw);
}설명
any는 타입 검사를 거의 우회하므로, 급할 때는 편하지만 장기적으로는 TypeScript의 이점을 크게 줄입니다.unknown은 "무슨 타입인지 아직 모른다"를 뜻하며, 사용 전에 확인 절차를 거치게 강제해 더 안전합니다.- 외부 입력, JSON 파싱 결과,
catch값처럼 불확실한 데이터는any보다unknown이 더 적절한 경우가 많습니다. never는 도달할 수 없는 상태나 모든 경우를 다 처리한 뒤 남는 불가능한 타입을 나타냅니다.- 특히 exhaustive check에서
never를 사용하면, union의 누락된 경우를 컴파일 시점에 더 잘 잡을 수 있습니다.
짧은 예제
ts
function fail(message: string): never {
throw new Error(message);
}
function parse(input: unknown) {
if (typeof input === "string") {
return input.trim();
}
return fail("string expected");
}빠른 정리
| 타입 | 의미 |
|---|---|
any | 타입 검사 우회, 가장 느슨함 |
unknown | 아직 모름, 사용 전 확인 필요 |
never | 불가능하거나 끝나지 않는 흐름 |
| 권장 | 불확실한 값엔 unknown 우선 |
| 위험 | any 남용은 타입 안정성 약화 |
주의할 점
any는 일시적인 탈출구로만 쓰는 편이 좋습니다. 한 번 넓게 퍼지기 시작하면 타입 정보가
연쇄적으로 약해져, 나중에는 TypeScript가 있어도 오류를 잡기 어려워집니다.
참고 링크
2 sources