Any 타입특정 변수의 타입을 확실히 모를 때 사용하는 타입이다.
하지만 any 타입을 사용하면 TypeScript의 타입 검사가 무력화되어 예상치 못한 버그를 초래할 수 있다.
let anyVar: any = 10;
anyVar = "hello";
anyVar = true;
anyVar = {};
anyVar = () => {};
// any 타입은 모든 속성 및 메서드를 사용할 수 있다.
anyVar.toUpperCase();
anyVar.toFixed();
let num: number = 10;
num = anyVar; // any 타입은 다른 타입에도 자유롭게 할당할 수 있다.
any 타입을 사용하면 타입 안전성이 보장되지 않으므로, 가능한 사용을 피하는 것이 좋다.Unknown 타입unknown 타입은 any와 비슷하지만, 보다 안전한 타입이다.
unknown 타입을 가진 변수는 타입이 확실해지기 전까지 임의의 연산을 수행할 수 없다.
let unknownVar: unknown;
unknownVar = "";
unknownVar = 1;
unknownVar = () => {};
// num = unknownVar; // ❌ 오류 발생: 'unknown' 타입은 직접 할당할 수 없음
// unknownVar.toUpperCase(); // ❌ 오류 발생: 'unknown' 타입에는 'toUpperCase' 속성이 없음
any 타입 🆚 unknown 타입| 구분 | any | unknown |
|---|---|---|
| 모든 타입 할당 가능 | ✅ 가능 | ✅ 가능 |
| 다른 타입으로 할당 | ✅ 가능 | ❌ 타입 검사 필요 |
| 속성 접근 및 메서드 호출 | ✅ 가능 | ❌ 직접 사용 불가 |
연산자 사용 (+, -, *, / 등) | ✅ 가능 | ❌직접 사용 불가 |
Unknown 타입의 값을 활용하는 방법unknown 타입의 값을 사용하려면 반드시 타입을 확인해야 한다.
이를 위해 typeof, instanceof 또는 타입 단언 (as) 등을 활용할 수 있다.
typeof를 사용한 타입 좁히기if (typeof unknownVar === "number") {
num = unknownVar; // ✅ 타입이 확인되었으므로 정상적으로 할당 가능
}
instanceof를 사용한 타입 좁히기class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
let obj: unknown = new Person("Alice");
if (obj instanceof Person) {
console.log(obj.name); // ✅ 타입이 확인되었으므로 안전하게 접근 가능
}
as) 사용num = unknownVar as number; // ⚠️ 타입 단언을 사용하면 강제로 타입을 지정할 수 있음
as를 사용하면 타입 검증이 약해지므로, 가급적 typeof 또는 instanceof를 사용하는 것이 좋다.any는 모든 타입의 값을 허용하며, 타입 검사가 사라진다.unknown은 모든 값을 저장할 수 있지만, 사용하기 전에 타입 검사를 해야 한다.unknown을 사용하면 보다 안전한 코드 작성이 가능하다.typeof, instanceof, 타입 단언 (as) 등을 활용할 수 있다.가능하면
any보다unknown을 사용하는 것이 안전하다.