개요
타입스크립트에서 특별한 타입들인
never
any
unknown
mixed
에 대해 간단하게 알아봅니다. 타입스크립트 챌린지 스터디를 완료 후 이전에 이해하고 있던 내용에 추가적인 내용이 들어가면 더 좋을 것 같아 수정합니다.들어가기 전에
타입스크립트는 각 타입을 각각 집합으로 생각하는 것이 가장 명확하고 이해하기 쉽습니다. 기존 객체지향언어들의 타입들을 생각하면, 타입스크립트가 다루는 타입들에 관한 연산들이 헷갈리게 됩니다. 잘 생각해보면 객체지향언어들에서는
never
any
unknown
mixed
와 같은 타입들은 많지 않습니다. 이번 포스트는 위 타입들에 대한 간략한 설명을 하는 포스트이므로, 간단하게 타입스크립트의 타입은 집합으로 이해하면 편하다 라고만 이해하고 넘어가겠습니다.never
타입
이해
never
타입은 어느 타입도 never
타입과 같을 수 없는, 집합으로 따지면 공집합에 해당하는 타입입니다. 어떠한 타입도 이 타입과 닮을 수 없습니다. 즉, 어떠한 타입도 never
타입의 부분집합이 될 수 없습니다.사용 예시
never
는 일반적으로 함수의 리턴 타입으로 사용되는데, 함수가 항상 예외를 던지거나, 무한루프를 돌아 정상적인 값을 리턴 받을 수 없는 경우에 사용하기도 합니다. 아예 함수의 return
문에 닿을 수 없는 경우에 사용합니다.function throwError(message: string): never { throw new Error(message); }
function infiniteLoop(): never { while(true) { count++; } }
사실
never
는 실제 비즈니스 로직을 작성할 때 사용하기 보다는 타입 연산을 할 때 더 유용하게 사용 할 수 있습니다.type Filter<T> = T extends string ? T : never; type Result = Filter<'a' | 'b' | 1 | true>; // 'a' | 'b'
any
타입
이해
any
타입은 타입스크립트의 타입 체계에서 모두를 허용하는 마스터키 같은 역할로, any
가 붙으면 타입스크립트는 타입 검사를 하지 않습니다. 그러므로, 우리가 아는 집합체계에는 일대일대응 하는 것이 없다고 봐야 합니다. 즉, 타입스크립트 컴파일러는 any
타입을 만나면 타입에 관한 모든 제약을 허용합니다.유의사항
any
타입은 웬만해서는 사용할 일이 적을 것 입니다. 사용하는 일이 많다면, 굳이 타입스크립트를 사용할 필요가 없습니다. 타입스크립트 보고 내가 알아서 할테니 너는 일하지 말라고 하는 것이 any
타입 지정이기 때문입니다. 사용하는 경우
하지만, 모든 경우에서
any
를 사용하지 않는 것이 정답은 아닙니다. 의도적으로 any
를 사용할 일도 있습니다. - IDE 나 코드 에디터 상에서 타입 추론이 매우 느릴 때,
any
를 통해 타입스크립트의 추론을 명시적으로 끊는 방법을 사용하기도 한다고 합니다.
- 타입스크립트를 지원하지 않는 오래된 라이브러리를 사용하는 경우 임시로
any
를 사용한다고 합니다.
- 런타임에서 타입이 결정되는 경우에도
any
를 사용하기도 한다고 합니다.
unknown
타입
이해
unknown
타입 또한 모든 타입과 같을 수 있는 타입입니다. 하지만, any
와 달리 unknown
은 전체 집합에 해당하는 타입입니다. 전체집합이기 때문에, 타입스크립트가 타입검사를 할 때는 unknown
단독 사용은 크게 도움이 되지 않습니다. 아래 예시에서 person 객체는 전체집합이기 때문에 person.name
이라는 속성을 가질 수 없습니다. 왜냐하면 어떤 집합은 name
이라는 속성을 가지지 않을 수 있는데, unknown
타입이라면 이 집합에 대한 제약조건도 만족해야하기 때문입니다.function greet(person: unknown) { return "Hello" + person.name; // ts-error }
그래서 이 타입은 어떤 제약이든 개발자가 대응해주겠다는 말을 의미하며, 일반적으로는
unknown
을 사용하게 되면, 추후 개발자가 직접적인 type narrowing 을 해 다양한 타입들에 대한 처리를 해주어야 합니다.사용 예시
어떤 타입의 값이던 개발자가 대응하겠다는 의도로 사용합니다.
function handleValue(input: unknown) { if (typeof input === "string") { console.log(input.toUpperCase()); } else { console.log("Not a string"); } }
어떤 알 수 없는 input 이 들어왔을 때, 타입에 따라 로직을 분기처리하고 싶을 때 사용합니다.
mixed
타입
이해
mixed
타입은 typescript 에는 존재하지 않는 타입이며, Flow 라는 언어에서 unknown 과 같은 전체집합 역할을 하는 타입입니다. 결론
타입스크립트는 각 타입을 집합의 개념으로 연산하며, 타입스크립트에서 타입을 하나 정의하는 것은 집합을 정의하는 것 입니다. 예약어로 지정된 타입들은 각각 전체집합(
unknown
), 공집합(never
), 제약무시(any
)의 역할을 합니다. 기존에 작성했던 포스트는, 제가 공부를 제대로 하지 않고 올렸던 포스트였네요. 무언가를 배포할 때는 좀 더 조사를 깊게 하고 배포해야겠다는 생각이 듭니다.