unknown과 any는 타입 안정성 측면에서 어떤 차이가 있나요?
답변 포인트
값을 사용하기 전에 타입 검사를 강제하는지 여부를 기준으로 생각해보세요.
정답 및 해설
빠른 요약
any는 타입 검사를 사실상 비활성화해 어떤 속성 접근이나 함수 호출도 허용합니다. unknown은 어떤 값이든 받을 수 있지만, 실제로 사용하려면 타입 좁히기나 검증을 먼저 해야 합니다.
any는 타입 검사를 사실상 비활성화해 어떤 속성 접근이나 함수 호출도 허용합니다. unknown은 어떤 값이든 받을 수 있지만, 실제로 사용하려면 타입 좁히기나 검증을 먼저 해야 합니다. 외부 입력처럼 타입을 확신할 수 없는 값에는 any보다 unknown이 안전합니다.
핵심 개념
핵심 기준은 타입 검사를 우회할지 강제할지의 차이입니다. 이 개념은 단순히 용어를 외우는 것보다, 어떤 문제를 줄이기 위해 등장했는지와 실제 코드나 운영 환경에서 어떤 trade-off를 만드는지 함께 이해하는 것이 중요합니다.
타입스크립트의 장점은 컴파일 시점에 위험한 사용을 발견하는 데 있습니다. any를 남발하면 이 장점이 사라지고 런타임 오류가 뒤늦게 드러납니다. unknown은 불확실한 값을 표현하되, 사용 전에 검증하도록 만들어 안전한 경계를 세웁니다.
동작 흐름
- 외부 API, JSON 파싱, 에러 객체처럼 타입을 모르는 값을 받습니다.
- 일단 unknown으로 선언해 직접 사용을 막습니다.
- typeof, Array.isArray, 사용자 정의 type guard로 타입을 좁힙니다.
- 검증된 범위 안에서만 속성 접근이나 함수 호출을 수행합니다.
실제 예시
function printMessage(value: unknown) {
if (typeof value === 'string') {
console.log(value.toUpperCase());
}
}unknown 값은 문자열인지 확인한 뒤에야 문자열 메서드를 안전하게 사용할 수 있습니다.
실무에서 주의할 점
- any는 마이그레이션 중 임시로만 사용하고 범위를 좁히는 것이 좋습니다.
- unknown을 사용해도 검증 로직이 부정확하면 런타임 오류가 날 수 있습니다.
- 타입 단언(as)을 남발하면 unknown의 안전 장점이 줄어듭니다.
함께 연결해서 보면 좋은 키워드
TypeScript, unknown, any, 타입안전성
면접에서 짚으면 좋은 포인트
- 외부 입력은 unknown으로 받고 좁힌 뒤 사용하는 경계를 강조하면 타입 안정성 의도가 분명해집니다.
- any는 마이그레이션이나 임시 우회로 제한하고, 사용 위치를 추적 가능하게 관리하는 것이 좋습니다.
정리
한 줄로 정리하면, any는 타입 검사를 우회하고, unknown은 값을 사용하기 전에 타입 검증을 강제해 더 안전합니다. 실무에서는 개념을 적용하는 조건과 적용하지 않았을 때 생기는 문제까지 함께 이해하는 것이 중요합니다.