
any 와 unknown은 값의 유형이 무엇인지 확실하지 않을 때, 사용되는 이스케이프 방법인 반면에
never는 모든 데이터 유형이 부족하고 값이 남지 않을 때 사용됩니다.
Any
any 타입은 타입 체크를 회피할 수 있는 타입으로, 어떤 종류의 값도 할당할 수 있습니다.
타입스크립트의 타입 시스템에서 any는 "어떤 것이든 될 수 있음"을 의미하며,
컴파일러에게 해당 변수에 대한 타입 체크를 수행하지 말라고 지시합니다.
any 타입으로 지정된 변수에는 무엇이든 할당 할 수 있습니다.

단점 :정의되지 않은 메서드를 호출할 수도 있으며, Typescript 에서는 오류가 발생하지 않습니다.

Unknown
unknown 타입은 타입스크립트 3.0에서 소개되었으며,
any 타입보다 타입 안전성을 강화한 타입입니다.
unknown 타입의 변수는 선언된 이후,
해당 변수의 타입을 좁혀가며 (타입 가드를 사용하여) 안전하게 사용해야 합니다.
any 타입은 타입 검사를 완전히 무시하기 때문에
TypeScript의 타입 시스템의 이점을 포기하는 것과 같습니다.
반면에,
unknown 타입은 "이 변수의 타입을 나중에 결정할 것이며, 그때까지는 모든 연산을 금지한다"는 의도를 명확히 합니다.
이를 통해 런타임 오류의 가능성을 줄이면서도 유연성을 유지할 수 있습니다.
unknwon 유형의 변수를 만들면 any 처럼 무엇이든 할당할 수 있지만,
그 후에 어떠한 동작도 수행할 수 없게 됩니다.
typescript에서 오류를 던져버리기 때문이죠.
any와 달리 unknown에 할당된 값에 대해서는
타입을 명시적으로 확인하거나 좁혀주지 않는 한
어떠한 연산이나 메서드 호출도 수행할 수 없습니다.
(unknown 변수 유형에 접근하려고 하는 것이 존재하지 않을 수도 있기 때문.)
unknwon은 unknwon 유형의 변수를 사용하기 전에 확인을 추가하도록 강제합니다.

에러 툴팁을 보면 typescript는 unknown 타입을 사용하기 전에 타입/값 체크를 실시할 것을 기대하고 있습니다.
any를 unknown으로 대체함으로써 typescript가 에러를 던져주는 이점이 생긴거죠.
unknown 유형에 대해 어떠한 조작을 실행하고 싶은 경우에는, 부가적인 체크를 추가해주면 됩니다.

그리고 함수 쪽에 있어서는 검사가 더 엄격해져야 합니다.

unknown 타입의 변수 exAnything에 대해 여러 가지 타입 체크를 수행한 후,
exAnything에 'undefinedMethod'라는 메서드가 존재하고,
그것이 실제로 함수인 경우에만 해당 메서드를 호출하게 됩니다.
코드를 단계별로 분석해보겠습니다:
let exAnything : unknown = undefined;
exAnything라는 이름의 변수를 선언하고 undefined로 초기화합니다.
unknown 타입은 TypeScript에서 사용되며,
아직 타입이 결정되지 않았거나 타입이 동적인 변수에 사용됩니다.
이 타입은 모든 값을 할당할 수 있지만,
그 값에 대해 아무런 연산도 수행할 수 없습니다 (엄격한 타입 검사를 위해).
if 문을 사용해 여러 조건을 체크합니다.
exAnything &&
=> exAnything가 truthy 값인지 확인합니다.
undefined는 falsy 값이므로 이 체크는 실패하고, 이 경우에는 if 문의 내부 블록은 실행되지 않습니다.
typeof exAnything === 'object' &&
=> exAnything가 객체인지 확인합니다.
typeof null도 'object'을 반환하지만,
첫 번째 조건에서 이미 falsy 값은 걸러내었으므로, 여기서는 null에 대한 검사는 필요 없습니다.
'undefinedMethod' in exAnything &&
=> exAnything에 'undefinedMethod'라는 속성(메서드)이 있는지 확인합니다.
typeof exAnything['undefinedMethod'] === 'function'
=> exAnything의 'undefinedMethod' 속성이 함수인지 확인합니다.
만약 위의 모든 조건이 true로 평가되면, if 문 내부에서 exAnything.undefinedMethod();를 호출합니다.
이는 exAnything 객체에 'undefinedMethod' 메서드가 존재하고,
그것이 함수 타입일 경우에만 안전하게 메서드를 호출하려는 의도를 가진 코드입니다.
그러나 주어진 코드에서 exAnything는 undefined로 초기화되었기 때문에,
첫 번째 조건 exAnything && 에서 이미 평가가 거짓이 되어 메서드 호출 부분까지 도달하지 않습니다.
만약 exAnything을 실제로 메서드를 포함하는 객체로 초기화했다면,
그리고 그 메서드가 'undefinedMethod'라면
이후의 조건들을 만족하고 메서드 호출이 수행될 것입니다.
Never
never는 any 타입의 반대라고 생각될 수도 있는데요.
any 타입은 어떠한 종류의 값이든 받을 수 있지만,
never 타입은 어떠한 종류의 값도 받지 않습니다.
never 타입은 그 자체로는 거의 사용되지 않으며, 주로 함수의 반환 타입으로 사용됩니다.
함수가 반환을 하지 않거나 (예를 들어, 함수 내에서 예외를 던지거나 무한 루프에 빠지는 경우),
절대 발생하지 않는 타입을 나타내기 위해 사용됩니다.
함수가 종료되지 않거나,
도달할 수 없는 코드 영역
(예: 타입 가드를 통해 모든 가능성을 제거한 후의 코드 영역) 에 대해 타입을 명시할 때 사용됩니다.
다시 말해보자면,
any는 모든 것을 허용하여 타입 체크를 무시하게 하는 반면,
never는 아무 것도 허용하지 않아 타입스크립트의 엄격한 타입 검사를 강화하는 데 도움을 주는거죠.
그 예시를 한번 보도록 하겠습니다.
1. if else 조건문

else 블록에서 문자열이나 숫자 이외의 것을 얻으면 오류가 발생합니다.
또한 object 를 허용하도록 함수를 변경하는 경우에도 처리하며,
object 유형을 처리할 if가 없으면 컴파일 구간에서 오류를 볼 수 있습니다.
2. in switch 조건문

3. 에러를 던지는 함수

4. never는 조건부로 자주 사용됩니다.

'개발 > TypeScript' 카테고리의 다른 글
TSC 의 컴파일 프로세스 (1) | 2024.04.01 |
---|---|
enum 보다는 union type (0) | 2024.02.27 |
개발 블로그
포스팅이 좋았다면 "좋아요❤️" 누르기 !