any를 버리고 unknown을 택하는 이유

v1.0.0
@young_log|Javascript|Published on 2026-01-28

"귀찮다고 다 any 처리해 버리면 안돼요~"

@
Details
Changelog
Dependencies

타입스크립트 3.0에서 추가된 unknown은 타입 시스템의 안전망을 강화하는 핵심 타입이다.
any와 비슷해 보이지만, 동작 방식과 철학은 완전히 다르다.
왜 우리가 any를 지양하고 unknown을 지향해야 하는지에 대한 내용이다


any: 타입 시스템의 포기 선언

any는 단어 그대로 "어떤 것이든 허용한다"는 뜻이다. 이는 타입스크립트를 쓰는 근본적인 이유를 무너뜨리는 선언과 같다.

  • 치명적인 유연성: never를 제외한 모든 타입에 할당할 수 있으며, 어떤 타입의 변수에도 any 값을 넣을 수 있다.
  • 실수 유발: 런타임에서 에러가 날 만한 코드도 컴파일 타임에 잡아내지 못한다. 즉, 타입 검사를 포기하는 것과 다름없다.

unknown: 알 수 없지만 신중한 타입

unknown은 "아직 이 타입이 무엇인지 모르니, 확인하기 전까지는 함부로 쓰지 마라"는 뜻을 가진다.

  • 할당의 제약: 모든 타입을 unknown에 할당할 수는 있지만(상위 타입), unknown 타입을 다른 타입에 할당할 수는 없다. 심지어 any를 제외하고는 unknown 변수를 다른 곳에 대입하는 것도 불가능하다.
  • 사용의 조건: unknown 타입의 변수는 그 타입이 무엇인지 **Type Guard(타입 가드)**를 통해 확인하기 전까지는 속성에 접근하거나 메서드를 호출할 수 없다.

비교 및 활용 (Type Guard)

두 타입의 가장 큰 차이는 '런타임 이전의 안전장치' 유무에 있다.

| 특징 | any | unknown |
| ---------- | ----------------- | -------------------- |
| 할당 가능성 | 어떤 타입의 변수에도 할당 가능 | 확인 전까지 다른 타입에 할당 불가 |
| 연산/메서드 | 즉시 사용 가능 (위험) | 타입 확인 전까지 사용 불가 (안전) |
| 안전성 | 매우 낮음 | 높음 |

TypeScript

// any의 위험성
let valueAny: any = "hello";
valueAny.toFixed(); // 컴파일 에러 없음 -> 런타임 에러 발생 가능
 
// unknown의 안전함
let valueUnknown: unknown = "hello";
// valueUnknown.toFixed(); // 컴파일 에러 발생 (안전)
 
if (typeof valueUnknown === "number") {
  valueUnknown.toFixed(); // 타입 가드 후 사용 가능
}

결론

any를 사용한다는 것은 타입스크립트의 보호를 거부하는 것과 같다.
반면 unknown은 개발자에게 확인 절차를 강제함으로써 코드에 안전함을 더해준다
무엇인지 모르는 데이터를 다룰 때는 항상 unknown으로 시작하여 타입을 좁혀나가는 습관을 들이면 좋을 것 같다!

Comments_Log
TERMINAL
DEBUG CONSOLE
OUTPUT
~/stay-young-loggit(main)npm run comment:write
nickname:
content:
-- TOTAL COMMENTS: 0 --
[LOADING...] fetching data from supabase...