any

어떤 타입이든 할당 가능

TypeScript의 타입 체크를 비활성화

let value: any = 10;

value = "hello";
value = true;

const num: number= parseInt(value); // 컴파일 에러 없음, 런타임 에러 발생

any는 예기치 못함 런타임 에러를 발생시키므로 사용을 권장하지 않음

unknown

any와 동일하게 모든 타입을 할당할 수 있지만

사용할 때 타입 체크가 없으면 컴파일 에러 발생(더 안전)

let value: unknown = 10;
value = 'hello';

const str: string = value.toUpperCase(); // 컴파일 에러 (타입 체크 필요)

if(typeof value === 'string') const str: string = value.toUpperCase(); // 타입 안전

never

절대 발생하지 않는 값

// 항상 에러를 던져 반환값이 있을 수 없는 함수
function throwError(message: string): never {
    throw new Error(message);
}
// 무한 루프를 돌아 반환값이 있을 수 없는 함수
function infiniteLoop(): never {
    while (true) {}
}

그럼 왜 사용하나?