| 타입 | 의미 | 값 할당 가능 대상 | 타입 안전성 | 주요 사용처 |
| any | 모든 타입 (타입 검사 해제) | 모든 값 | 낮음 | 기존 JS 코드 마이그레이션 등 |
| unknown | 모든 타입 (안전한 버전) | 모든 값 (사용 전 타입 확인) | 높음 | 불확실한 외부 데이터 처리 |
| void | 반환 값 없음 | undefined (또는 null) | 해당 없음 | 반환 값 없는 함수 |
| never | 절대 발생 불가 값 | 없음 | 높음 | 예외 발생/무한 루프 함수, 도달 불가 코드, Exhaustiveness Check |
any
- 모든 타입의 값을 받을 수 있다.
- 타입 안정성을 포기하게 된다.
any 타입을 사용하는 순간 타입스크립트의 타입 검사가 무력화되어, 런타임에 발생할 수 있는 오류를 컴파일 시점에 잡아내지 못하게 다. - 타입이 결정 안난 경우 미리 코드를 짜기 위해 사용될 수 있다.
타입스크립트 사용의 가장 큰 목적인 타입 안전성을 해치므로, 꼭 필요한 경우가 아니라면 any 타입 사용 X
let myValue: any = 10;
myValue = "hello"; // string 할당 가능
myValue = true; // boolean 할당 가능
let unknownData: any = { x: 1, y: 2 };
console.log(unknownData.z); // 컴파일 오류 없음 (실행 시 undefined)
unknownData.someMethod(); // 컴파일 오류 없음 (실행 시 TypeError)
unknown
- 모든 타입의 값을 받을 수 있습니다 (any와 동일).
- 타입 안전성을 유지합니다.
unknown 타입의 값을 사용하려면 typeof, instanceof, 사용자 정의 타입 가드 등을 통해 타입을 확인해야 합니다. - 타입 정보를 알 수 없는 외부 데이터(API 응답, 사용자 입력 등)를 다룰 때 any보다 안전한 대안으로 사용된다.
let myUnknownValue: unknown = 10;
myUnknownValue = "hello"; // string 할당 가능
myUnknownValue = { greeting: "hi" }; // object 할당 가능
// myUnknownValue.greeting; // 오류! unknown 타입은 바로 속성에 접근할 수 없음.
if (typeof myUnknownValue === 'string') {
// 이 블록 안에서는 myUnknownValue의 타입이 string으로 좁혀집니다.
console.log(myUnknownValue.toUpperCase()); // string 메서드 사용 가능
} else if (typeof myUnknownValue === 'object' && myUnknownValue !== null && 'greeting' in myUnknownValue) {
// 이 블록 안에서는 myUnknownValue의 타입이 { greeting: string } 등으로 좁혀질 수 있습니다.
console.log((myUnknownValue as { greeting: string }).greeting); // 타입 단언 또는 추가적인 가드로 접근 가능
}
void
- 함수의 return 문이 없거나 return; (값을 반환하지 않음) 또는 return undefined; 일 때
해당 함수의 반환 타입은 void로 추론된다. - void 타입 변수에는 undefined만 할당할 수 있다. (strict 모드 off 시 null도 가능)
- 함수의 부수 효과(side effect)가 주 목적이고 반환 값은 중요하지 않음을 명확히 합니다.
- 함수가 어떤 작업을 수행하지만 그 결과로 특정 값을 반환하지 않을 때 사용
function logMessage(message: string): void {
console.log(message);
// return; // void 함수에서 값을 반환하지 않음
// return undefined; // void 함수에서 undefined 반환 가능 (JS 호환성)
}
let result: void = logMessage("Hello"); // logMessage는 값을 반환 X > result=undefined
// let result2: void = 123; // 오류! void 타입에는 undefined 외에 다른 값을 할당 X
interface ExType{
a:string;
b:number;
logMessage : (message: string)=>void //리턴 값 없을때 void 써줘야함
}
never
절대 발생할 수 없는 값의 타입
- Exhaustiveness Check: 유니온 타입을 다룰 때, 가능한 모든 경우를 처리했는지 확인하는 용도로 유용하게 사용.
// 예외를 throw 하는 함수
function error(message: string): never {
throw new Error(message);
}
// 무한 루프 함수
function infiniteLoop(): never {
while (true) {
// ... do something
}
}
// Exhaustiveness Check 예시
type Shape = { type: "square", side: number } | { type: "circle", radius: number };
//유니온 타입 합집합과 비슷하기 때문에 하나만 오게 하고 싶을때 never 사용할 수 있음
function getArea(shape: Shape): number | never { // 반환 타입이 number 또는 never
switch (shape.type) {
case "square":
return shape.side * shape.side;
case "circle":
return Math.PI * shape.radius * shape.radius;
default:
// 만약 Shape에 새로운 타입이 추가되었는데 여기서 처리하지 않으면,
// shape의 타입이 never가 아니게 되어 컴파일 오류가 발생합니다.
const _exhaustiveCheck: never = shape; // <-- 여기서 오류 체크!
return _exhaustiveCheck;
}
}
문제 :
문제은행 4강 - 고급타입 - HackMD
작업의 상태는 다음과 같습니다:
hackmd.io
'2024~ > React' 카테고리의 다른 글
| [타입스크립트] 스포티파이 만들기 (1) | 2025.06.02 |
|---|---|
| [타입스크립트] 교차타입 (1) | 2025.06.01 |
| [타입스크립트] 고급 타입- enum (2) | 2025.05.31 |
| [타입스크립트] 3강- type, interface (2) | 2025.05.27 |
| [타입스크립트] 객체 & 배열 & 튜플 타입 - 조합의 시작 (1) | 2025.05.26 |