Node개발을 하면서 JavaScript로만 개발을 진행하다보면
null, undefined이 변수에 저장되어 있다거나
파라미터에 마우스를 가져다대면 any라고 되어있었는데 왜 이렇게 설정되어 있는지 몰랐습니다.
null은 무엇이고 언제 사용되는거고 undefined와 차이점은 무엇인지 또 타입스크립트를 배우면서
타입 계층도에 unknown라인에 있는 타입들은 무엇인지 궁금하여 다시 정리하고 공부해보았고
정리해놓은 글입니다.
1. unknown
- unknown 타입은 TypeScript에서 사용할 수 있는 가장 제한적인 "알 수 없는" 타입입니다.
- 정의: 어떤 값이 unknown 타입으로 정의되면, 이 값의 정확한 타입을 알 수 없다는 것을 의미합니다
- 특징:
- **any**와 비슷하지만, 안전성이 높습니다.
- unknown 타입의 값을 사용할 때는 타입 확인(type-check)이 필요합니다. 즉, 해당 값을 다른 타입으로 사용하기 전에 반드시 어떤 타입인지 확인해야 합니다.
- 사용 예시:
- let value: unknown; value = "Hello"; value = 42; // 다음과 같이 타입을 확인하지 않고 사용하면 오류가 발생합니다. // console.log(value.toUpperCase()); // Error! // 올바르게 사용하기 위해서는 타입 확인이 필요합니다. if (typeof value === "string") { console.log(value.toUpperCase()); // 정상 출력: "HELLO" }
- 적절한 사용 상황:
- 외부에서 들어오는 데이터(예: API 응답)를 다룰 때, 처음에는 정확한 타입을 모를 경우 사용됩니다.
- **unknown**을 통해 불확실한 타입을 다루고자 할 때 타입 검사를 강제할 수 있으므로 안전한 코딩이 가능합니다.
2. any
- any 타입은 TypeScript에서 가장 유연하면서도 가장 위험한 타입입니다.
- 정의: **any**는 "아무거나 될 수 있는" 타입을 의미합니다. 즉, 어떤 값이라도 할당할 수 있습니다.
- 특징:
- 모든 타입의 값을 할당할 수 있고, 이 값으로 아무런 제한 없이 연산을 수행할 수 있습니다.
- **any**는 TypeScript의 타입 검사 기능을 사실상 무력화합니다.
- 남용할 경우 버그를 유발할 가능성이 높아집니다.
- 사용 예시:
- let value: any; value = "Hello"; value = 42; console.log(value.toUpperCase()); // 런타임 오류가 발생할 수도 있지만 컴파일러는 체크하지 않음
- 적절한 사용 상황:
- **any**는 사용을 지양하는 것이 좋습니다. 그러나 타입 정보를 알 수 없는 라이브러리나 레거시 코드와의 호환을 위해 일시적으로 사용되기도 합니다.
3. void
- void 타입은 함수에서 반환 값이 없는 경우를 나타냅니다.
- 정의: **void**는 어떤 타입도 없다는 의미로 사용됩니다. 일반적으로 함수가 아무런 값을 반환하지 않을 때 그 함수의 반환 타입을 **void**로 설정합니다.
- 특징:
- **void**는 특정 상황에서 반환값을 없도록 강제하기 위해 사용됩니다.
- 사용 예시:
- 위 함수는 반환값이 없으므로 반환 타입이 **void**입니다.
- function logMessage(message: string): void { console.log(message); }
- 적절한 사용 상황:
- 함수가 아무것도 반환하지 않을 때 이를 명시적으로 나타내기 위해 사용됩니다.
4. undefined
- ***undefined***는 JavaScript의 원시 타입 중 하나로, 변수가 초기화되지 않은 상태를 나타냅니다.
- 정의: **undefined**는 값이 할당되지 않은 변수의 기본값입니다.
- 특징:
- 일반적으로 변수를 선언했지만 값을 할당하지 않은 경우 해당 변수는 undefined 상태입니다.
- 함수의 반환 타입이 **undefined**일 경우, 명시적으로 아무 값도 반환하지 않거나, 명시적으로 **return;**을 사용할 수 있습니다.
- 사용 예시:
- let value: undefined = undefined; function doNothing(): undefined { return undefined; }
- 적절한 사용 상황:
- **undefined**는 기본적으로 JavaScript 런타임에서 사용되며, 타입스크립트에서는 명시적으로 undefined 값을 사용하는 것을 지양합니다. 대신 타입 검사 등을 통해 예상치 못한 undefined 값을 방지하는 것이 좋습니다.
5. never
- never 타입은 절대 도달할 수 없는 상태를 나타냅니다.
- 정의: never 타입은 절대로 발생하지 않는 값을 의미합니다. 예를 들어, 함수가 절대 반환하지 않거나, 무조건 오류를 던지는 경우 그 함수의 반환 타입은 **never**입니다.
- 특징:
- never 타입은 값을 반환할 수 없기 때문에, 종료되지 않는 함수나 항상 오류를 발생시키는 함수에서 사용됩니다.
- 예를 들어, 무한 루프에 빠지거나 오류가 발생할 때 사용됩니다.
- 사용 예시:
- function throwError(message: string): never { throw new Error(message); } function infiniteLoop(): never { while (true) { // 무한 반복 } }
- 적절한 사용 상황:
- **never**는 주로 함수가 오류를 발생시키거나 영원히 종료되지 않는 경우 사용합니다.
- 예를 들어, 타입 가드로 모든 가능한 경우를 처리한 후에도 예외적인 상황이 발생했을 때 이를 방지하기 위해 사용됩니다.
요약
타입 설명 사용 예시
unknown | 타입이 불명확한 상태, 안전한 타입 체크가 필요함 | 외부 입력 데이터 |
any | 모든 타입을 허용하며 타입 검사 비활성화 | 호환성 필요 시 |
void | 반환 값이 없는 함수의 타입 | 로그 함수 등 |
undefined | 값이 할당되지 않은 상태, 초기화되지 않은 변수에 사용 | 초기값 없는 변수 |
never | 절대 발생하지 않는 상황 (오류 또는 무한 루프 등) | 오류 발생 함수 |
이렇게 각 타입은 특정 상황에 적합한 용도로 사용되며, 코드의 안전성과 명확성을 높이기 위해 적절한 타입을 선택하는 것이 중요합니다. TypeScript를 사용할 때는 **any**를 최대한 피하고, unknown, void, undefined, never 등을 상황에 맞게 활용하는 것이 좋은 코드 품질을 유지하는 방법입니다.
'TypeScript' 카테고리의 다른 글
TypeScript 인터페이스 (0) | 2024.10.29 |
---|---|
TypeScript 정리3 (함수와 타입) (0) | 2024.10.25 |
TypeScript 정리2 (이해하기) (3) | 2024.10.25 |
TypeScript 기본 (3) | 2024.10.25 |
TypeScript 개론 (0) | 2024.10.25 |