Any와 Unknown 타입
타입스크립트는 모든 변수의 타입을 엄격하게 관리하지만,
개발 과정에서 불가피하게 타입을 알 수 없거나 유연한 처리가 필요한 상황이 발생한다.
이때 사용하는 것이 any와 unknown이다.
Any 타입
any는 타입스크립트의 모든 타입 검사를 무력화하는 치트키(Cheat Key) 같은 타입이다.
특정 변수의 타입을 우리가 확실히 모를때 사용한다. (any: 어떤 타입이든지 가능!)
특징
- 모든 값 허용: 숫자, 문자열, 불리언 등 어떤 타입의 값이라도 할당할 수 있다.
- 모든 연산 허용: 타입 검사를 받지 않으므로, 메서드 호출이나 연산 등 모든 동작이 허용된다.
- 모든 곳에 할당 가능: any 타입의 값은 다른 어떤 타입의 변수에도 할당할 수 있다.
let anyVar: any = 10;
anyVar = "hello"; // ✅ OK: 타입 변경 가능
anyVar = true; // ✅ OK: 타입 변경 가능
anyVar.toUpperCase(); // ✅ OK: 컴파일 에러 없음
anyVar.toFixed(); // ✅ OK: 컴파일 에러 없음
let num: number = 10;
num = anyVar; // ✅ OK: 모든 타입 변수에 할당 가능
⚠️ 위험성 any는 컴파일 단계에서 에러를 잡지 않으므로, 실행 시점(Runtime)에 치명적인 오류를 발생시킬 수 있다.
위 코드에서 anyVar가 true일 때 toUpperCase()를 호출하면 런타임 에러가 발생하여 프로그램이 종료된다.
👉🏻 any는 타입스크립트의 사용 이점을 없애버리므로, 불가피한 경우가 아니면 사용을 지양해야 한다.
Unknown 타입
unknown은 any와 비슷하게 모든 값을 저장할 수 있지만, 사용은 엄격하게 제한되는 보다 안전한 타입이다.
특징
- 모든 값 허용: any처럼 어떤 타입의 값이라도 할당할 수 있다.
- 사용 제한 (중요):
- unknown 타입의 값은 any나 unknown 타입을 제외한 다른 변수에 할당할 수 없다.
- 프로퍼티 접근, 메서드 호출, 연산 등이 불가능하다.
let unknownVar: unknown;
// 값을 넣는 것은 자유로움
unknownVar = "";
unknownVar = 1;
unknownVar = () => {};
// ❌ Error: 다른 타입의 변수에 할당 불가
let num: number = 10;
// num = unknownVar;
// ❌ Error: 연산 및 메서드 호출 불가
// unknownVar * 2;
// unknownVar.toUpperCase();
👍🏻 올바른 사용법: 타입 좁히기 (Type Narrowing) unknown 타입의 값을 실제로 사용하려면, 조건문을 통해 현재 값이 어떤 타입인지 확인하는 과정을 거쳐야 한다. 이를 타입 좁히기라고 한다.
if (typeof unknownVar === "number") {
// 이 블록 안에서는 unknownVar가 number 타입으로 간주됨
console.log(unknownVar * 2); // ✅ OK
}
결론
변수의 타입을 미리 알 수 없는 상황이라면,
무조건적인 자유를 주는 any보다는 값을 할당할 수는 있되 사용에는 제약을 두는 unknown을 사용하는 것이 훨씬 안전하다.
'🟣 TypeScript' 카테고리의 다른 글
| [TypeScript] 타입은 집합이다(업캐스팅, 다운캐스팅) (1) | 2025.12.13 |
|---|---|
| [TypeScript] Void와 Never 타입 (0) | 2025.12.13 |
| [TypeScript] 열거형 타입 (Enum Type) (0) | 2025.12.11 |
| [TypeScript] 타입 별칭 (Type Alias)과 인덱스 시그니쳐 (Index Signature) (0) | 2025.12.11 |
| [TypeScript] 객체(Object) (0) | 2025.12.11 |
