any
- 모든 타입의 값을 할당 가능
- 타입 안전성이 보장되지 않음
- 타입 추론이 어려워짐
let value: any = "Hello";
value = 42;
value = true;
function logValue(val: any): void {
console.log(val);
}
logValue(value); // true
unknown
- 모든 타입의 값을 할당 가능
- 다른 타입에 할당하려면 타입 검사가 필요
- 타입 안전성을 유지 가능
let value: unknown = "Hello";
value = 42;
value = true;
function logValue(val: unknown): void {
if (typeof val === "string") {
console.log(val.toUpperCase()); // "HELLO"
} else if (typeof val === "number") {
console.log(val.toFixed(2)); // 42.00
} else {
console.log(val);
}
}
logValue(value); // true
never
- 절대 발생하지 않는 값을 의미함
- 모든 타입의 서브 타입이지만, 어떤 타입도
never
의 서브 타입이 아님
- 항상 예외를 던지거나, 무한 루프에 빠지는 경우 또는 타입이 모두 소진되는 경우 등에 사용
function error(message: string): never {
throw new Error(message);
}
function infiniteLoop(): never {
while (true) {}
}
function handleValue(val: string | number): string {
if (typeof val === "string") {
return val.toUpperCase();
} else if (typeof val === "number") {
return val.toFixed(2);
}
// 타입 검사기에게 handleValue가 모든 경우를 처리했다고 알리기 위해 never를 사용
return error("Unexpected value: " + val);
}
void
function logMessage(message: string): void {
console.log(message);
}
let unusable: void = undefined;