둘 다 어떤 값이든 담을 수 있지만 안전성에서 차이가 있습니다. any는 타입 검사를 꺼버리고, unknown은 검사를 유지하며 사용 전에 narrowing을 강제합니다.
ts
let a: any = "hello";
a.foo.bar; // ✅ 컴파일됨 — 검사가 전혀 없음 (런타임에 크래시 가능)
a(); // ✅ 컴파일됨 — TypeScript가 무조건 신뢰함
let u: unknown = "hello";
u.toUpperCase(); // ❌ 오류: object is of type 'unknown'
u(); // ❌ 오류 — 먼저 narrowing 해야 함
unknown은 사용 전에 검사를 강제합니다
ts
function handle(input: unknown) {
if (typeof input === "string") {
input.toUpperCase(); // ✅ 가드 안에서는 TS가 string임을 앎
}
}
unknown은 any의 타입 안전한 대응물입니다. 무엇이든 대입할 수 있지만, type guard로 그 정체를 증명하기 전까지는 그것으로 아무것도 할 수 없습니다.
언제 무엇을 쓸까
unknown— 경계에서 진짜 타입을 알 수 없는 값에 사용:JSON.parse결과, API 응답,catch (e: unknown). 검증을 강제합니다.any— JS를 마이그레이션하거나 정말로 타입을 지정할 수 없을 때의 탈출구. 조심해서 사용하세요. 조용히 퍼지고 안전성을 비활성화합니다.
왜 중요한가
any에 손을 뻗는 것은 TypeScript의 목적을 무력화합니다.
타입이 없는 경계에서는 unknown을 선호하세요. 임의의 입력을 받아들이면서도 컴파일러의 보증을 유지하며, 데이터를 신뢰하기 전에 검증하도록 유도합니다.
