top 타입은 타입스크립트에서 가능한 모든 값을 나타내는 타입이다. 모든 값은 top 타입에 할당될 수 있다.
any 타입은 모든 타입의 위치에 제공될 수 있다는 점에서 top 타입처럼 작동할 수 있다. any는 일반적으로 console.log의 매개변수와 같이 모든 타입의 데이터를 받아들여야 하는 위치에서 사용한다.
let anyValue: any;
anyValue = "Lucille Ball"; // ok
anyValue = 123; // ok
console.log(anyValue); // ok
하지만 any는 타입스크립트가 해당 값에 대한 타입 검사를 수행하지 않도록 명시적으로 지시한다는 문제점이 있다.
function greetComedian(name: any) {
// 타입 오류 없음
console.log(`Announcing ${name.toUpperCase()}!`);
}
greetComedian({ name: "Bea Arthur" });
// Runtime error: name.toUpperCase is not a function
위에서 name.toUpperCase() 호출은 문제가 있지만, any로 선언되어 있어 타입 오류를 보고하지 않는다.
어떤 값이든 될 수 있음을 나타내려면 unknown 타입이 훨씬 안전하다.
unknown 타입은 모든 객체를 unknown 타입의 위치로 전달할 수 있다는 점에서 any 타입과 유사하다. 차이점은 unknown 타입의 값을 훨씬 더 제한적으로 취급한다는 점이다.
function greetComedian(name: unknown) {
console.log(`Announcing ${name.toUpperCase()}!`);
//
// Error: Object is of type 'unknown'.
}
위처럼 unknown 타입 값의 속성에 접근하려고 하면 타입 오류가 발생한다.
위 예제에서 unknown 타입인 name에 접근하려면 istanceof나 typeof 또는 타입 어서션을 사용하여 값의 타입을 제한해야 한다.
function greetComedianSafety(name: unknown) {
if (typeof value === "string") {
console.log(`Announcing ${name.toUpperCase()}!`); // ok
} else {
console.log("Well, I'm off.");
}
}
greetComedianSafety({ name: "Betty White" });
geetComedianSafety({});
unknown 타입의 이러한 제한사항들로 인해 any보다 훨씬 안전한 타입으로 사용된다. 가능하다면 any 대신 unknown을 사용하는 것이 좋다!
Reference
러닝 타입스크립트