TypeScript의 any와 unknown 타입 차이점

lyju777·2024년 12월 9일
post-thumbnail

any와 unknown 타입의 주요 차이점

anyunknown 타입은 TypeScript에서 모든 타입의 값을 수용할 수 있지만 사용 방식과 타입 안정성 측면에서 큰 차이가 있습니다.


any 타입

👉 타입 검사를 완전히 비활성화
👉 모든 연산이 허용됨
👉 타입 안정성을 완전히 포기하게 됨

let anyValue: any = 10;
anyValue.toLowerCase();  // 컴파일 에러 없음 (런타임 에러 발생)
anyValue = "hello";
anyValue = true;
anyValue = {};

any 타입을 사용하게 되면 사실상 TypeScript를 사용하는 이점이 사라지기 때문에 특별한 경우가 아니라면 사용을 권장하지 않습니다.


unknown 타입

👉 타입 좁히기를 사용하거나 타입 단언이 필요함
👉 더 안전한 타입 처리 가능

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 타입은 사용하기 전에 반드시 타입 좁히기나 타입 단언이 필요합니다.

profile

0개의 댓글