◎ any 타입
any타입은 타입스크립트에서만 제공되는 특별한 타입으로 타입 검사를 받지 않는 특수한 타입입니다. 특정 변수의 타입을 확실하게 모를 때 사용하며 타입스크립트가 가진 장점을 포기하는 타입이기 때문에 최대한 사용하지 않는 것을 추천합니다.
let anyVar = 10;
anyVar = "hello"; // ❌
타입스크립트에서는 변수를 초기화할 때 초기화하는 값을 기준으로 변수의 타입을 추론합니다. 현재 변수 anyVar에는 number 타입의 값 10으로 초기화했지만 이후에 string 타입의 값 "hello"를 저장하려고 하여서 오류가 발생하였습니다. 이럴 때에 사용하는 것이 any라는 치트키 타입입니다.
let anyVar: any = 10;
anyVar = "hello";
anyVar = true;
anyVar = {};
anyVar = () => {};
anyVar.toUpperCase();
anyVar.toFixed();
이렇게 any 타입은 어떠한 타입 검사도 받지 않기 때문에 아무 타입의 값이나 저장할 수 있고, 다양한 타입의 메서드를 사용해도 문제가 되지 않습니다.
하지만 위의 코드에서 tsx로 컴파일시켜보면 런타임 오류가 발생합니다. any 타입은 타입 검사를 받지 않는 타입이므로 모든 타입스크립트의 문법과 규칙으로부터 자유롭지만 그만틈 위험한 타입입니다. 따라서 any 타입을 많이 사용하게 되면 위험한 코드가 생산되고 이렇게 되면 사실 타입스크립트를 사용하는 이유가 없게 됩니다. 따라서 웬만해서는 any 타입을 사용하지 않는 것을 추천드립니다. 😭
let anyVar: any = 10;
anyVar = "hello";
let num: number = 10;
num = anyVar;
또한, number 타입의 변수 num에 any 타입의 값 anyVar를 할당하여도 문제가 발생하지 않습니다.
◎ unknown 타입
let unknownVar: unknown;
unknownVar = "";
unknownVar = 1;
unknownVar = () => {};
let num: number = 10;
num = unknownVar; // ❌
unknownVar * 2 // ❌
unknownVar.toUpperCase(); // ❌
unknown 타입은 any 타입과 비슷하지만 더 안전한 타입으로, 어떤 타입의 값이든 다 저장할 수 있습니다. 하지만 반대로는 불가능합니다. number 타입의 변수 num에 unknown 타입의 변수 unknownVar을 저장하는 것이 불가능하다는 의미입니다. 또한, unknown 타입의 값은 어떤 연산도 불가능하며, 또한 어떤 메서드도 사용할 수 없습니다. 결국 오직 값을 저장하는 역할만 하는 것이죠.
let num: number = 10;
let unknownVar: unknown;
if (typeof unknownVar === "number") {
num = unknownVar;
}
만약 unknownVar 타입의 값을 number 타입의 값이라고 확실하게 밝혀주었을 떄에만 이와 같은 식에서 오류가 나지 않습니다. 이를 타입 정제라고 합니다.
◎ void 타입
function func2(): void {
console.log("hello");
}
void 타입은 아무런 값도 없음을 의미하는 타입으로, 아무 값도 반환하지 않는 함수의 반환값 타입을 정의할 때 사용합니다. 이때 반환값이 없다고 undefined나 null로 타입을 지정하면 안됩니다.
let a: void;
// a = 1;
// a = "hello";
// a = {};
a = undefined;
// a = null; //strictNullChecks가 false이면 null도 담을 수 있다.
다음과 같이 void로도 변수의 타입을 지정할 수는 있습니다. 하지만 void 타입의 변수에는 undefined 이외의 다른 타입의 값들은 저장할 수 없습니다. 왜냐하면 void 타입이 undefined 타입을 포함하는 타입이기 때문입니다. 하지만 마지막줄 코드처럼 tsconfig.json에 엄격한 null 검사인 strictNullChecks 옵션을 해제하도록 설정하면 null 값도 저장할 수 있게 됩니다.
◎ never 타입
function func3(): never {
while (true) {}
}
function func4(): never {
throw new Error();
}
never 타입은 존재하지 않는 불가능한 타입을 의미하고, 함수가 어떠한 값도 반환할 수 없는 상황일 때 함수의 반환값 타입 정의에 사용합니다. 함수 func3은 무한 루프를 돌기 때문에 값을 반환한다는 것 자체가 불가능합니다. 그래서 불가능한 값의 타입을 정의할 때 never 타입을 사용하는 것이죠. 또한, 의도적으로 오류를 발생시키는 func4라는 함수처럼 never 타입으로 반환값 타입을 정의할 수 있습니다.
let anyVar: any;
let a: never;
a = 1;
a = null;
a = undefined;
a = anyVar;
변수의 타입을 never로 정의하면 any를 포함하여 그 어떠한 타입의 값도 이 변수에 저장할 수 없습니다.
출처) 한 입 크기로 잘라먹는 타입스크립트(TypeScript)_이정환
'📍 프로그래밍 언어 > TypeScript' 카테고리의 다른 글
[ TypeScript ] 대수 타입 & 타입 추론: 강력한 타입 시스템 이해하기 (0) | 2024.12.19 |
---|---|
[ TypeScript ] 타입 계층도와 함께 살펴보는 타입 호환성 (0) | 2024.12.19 |
[ TypeScript ] 타입 설계: 타입 별칭, 인덱스 시그니처, 열거형 타입으로 코드 최적화하기 (0) | 2024.12.18 |
[ TypeScript ] 배열과 튜플, 그리고 객체 이해하기 (0) | 2024.12.18 |
[ TypeScript ] 데이터 타입 (기본타입 / 원시타입 / 리터럴타입) (0) | 2024.12.18 |