
any와 unknown 타입은 TypeScript에서 모든 타입의 값을 수용할 수 있지만 사용 방식과 타입 안정성 측면에서 큰 차이가 있습니다.
👉 타입 검사를 완전히 비활성화
👉 모든 연산이 허용됨
👉 타입 안정성을 완전히 포기하게 됨
let anyValue: any = 10;
anyValue.toLowerCase(); // 컴파일 에러 없음 (런타임 에러 발생)
anyValue = "hello";
anyValue = true;
anyValue = {};
any 타입을 사용하게 되면 사실상 TypeScript를 사용하는 이점이 사라지기 때문에 특별한 경우가 아니라면 사용을 권장하지 않습니다.
👉 타입 좁히기를 사용하거나 타입 단언이 필요함
👉 더 안전한 타입 처리 가능
let unknownValue: unknown = 10;
// unknownValue.toLowerCase(); // 컴파일 에러 발생
// 타입 검사 후 사용
if (typeof unknownValue === "string") {
unknownValue.toLowerCase(); // 정상 동작
}
// 타입 단언으로 사용
let value: unknown = "Hello World";
(value as string).toLowerCase(); // 정상 동작
// 사용자 정보 타입 정의
interface User {
id: number;
username: string;
}
// unknown 사용 (권장 패턴)
const getUser = async (userId: number): Promise<User> => {
const data: unknown = await fetch(`https://api.example.com/users/${userId}`).then(res => res.json());
if (isUser(data)) return data;
throw new Error('Invalid user data');
}
// 타입 가드
const isUser = (data: unknown): data is User =>
typeof data === 'object' && data && 'id' in data && 'username' in data;
unknown 타입은 any 타입과 동일하게 모든 값을 허용하지만 할당된 값이 어떤 타입인지 모르기 때문에 함부로 프로퍼티나 연산을 할 수 없습니다.
1.unknown 타입은 any 타입의 안전 버전이라고 볼 수 있습니다.
2.unknown 타입은 사용하기 전에 반드시 타입 좁히기나 타입 단언이 필요합니다.