정리
타입스크립트는 코드 정보에 입각한 추론을 수행하는 유니언(union)과 내로잉(narrowing)이라는 두 가지 개념이 있다.
유니언 타입
유니언 타입은 값이 정확히 어떤 타입인지 모르지만 두 개 이상의 옵션 중 하나라는 것을 알고 있는 경우에 코드를 처리하는 개념이다.
타입스크립트는 가능한 값 또는 구성 요소 사이에
|
(수직선) 연산자를 사용해 유니언 타입을 나타낸다.유니언 타입 선언
변수의 초깃값이 있더라도 변수에 대한 명시적 타입 애너테이션을 제공하는 것이 유용할 때 유니언 타입을 사용한다.
유니언 타입 선언은 타입 애너테이션으로 타입을 정의하는 모든 곳에서 사용할 수 있다.
유니언 속성
값이 유니언 타입일 때 타입스크립트는 유니언으로 선언한 모든 가능한 타입에 존재하는 멤버 속성에만 접근할 수 있다.
유니언 타입으로 정의된 여러 타입 중 하나의 타입으로 된 값의 속성을 사용하려면 코드에서 값이 보다 구체적인 타입(specific type) 중 하나라는 것을 타입스크립트에 알려야 한다.
내로잉
내로잉은 값이 정의, 선언 혹은 이전에 유추된 것보다 더 구체적인 타입임을 코드에서 유추하는 것이다.
타입을 좁히는 데 사용할 수 있는 논리적 검사를 타입 가드(type guard)라고 한다.
값 할당을 통한 내로잉
변수에 값을 직접 할당하면 타입스크립트는 변수의 타입을 할당된 값의 타입으로 좁힌다.
변수에 유니언 타입 애너테이션이 명시되고 초깃값이 주어질 때 값 할당 내로잉이 작동한다.
조건 검사를 통한 내로잉
일반적으로 타입스크립트에서는 변수가 알려진 값과 같은지 확인하는
if
문을 통해 변수의 값을 좁히는 방법을 사용한다.타입스크립트는
if
문 내에서 변수가 알려진 값과 동일한 타입인지 확인한다.typeof 검사를 통한 내로잉
타입스크립트는 직접 값을 확인해 타입을 좁히기도 하지만,
typeof
연산자를 사용할 수도 있다.리터럴 타입
리터럴 타입(literal type)은 좀 더 구체적인 버전의 원시 타입이다.
원시 타입 값 중 어떤 것이 아닌 특정 원싯값으로 알려진 타입이 리터럴 타입이다.
원시 타입은 해당 타입의 가능한 모든 리터럴 값의 집합이다.
리터럴 타입은 그 값이 해당하는 원시 타입에 할당할 수 있다.
엄격한 null 검사
엄격한 null 검사는 다른 타입이 필요한 위치에서 null 값을 사용하지 못하도록 검사하는 것이다.
엄격한 null 검사를 활성화해야만 코드가 null 또는 undefined 값으로 인한 오류로부터 안전한지 여부를 쉽게 파악할 수 있다.
참 검사를 통한 내로잉
타입스크립트는 잠재적인 값 중 truthy로 확인된 일부에 한해서만 변수의 타입을 좁힐 수 있다.
논리 연산자인
&&
와 ?
는 참 여부를 검사하는 일을 잘 수행한다. 하지만 참 여부 확인 외에 다른 기능은 제공하지 않는다.string | undefined
값에 대해 알고 있는 것이 falsy라면, 그것이 빈 문자열인지 undefined인지는 알 수 없다.초깃값이 없는 변수
타입스크립트는 값이 할당될 때까지 변수가 undefined임을 이해할 만큼 충분히 영리하다.
값이 할당되기 전에 속성 중 하나에 접근하려는 것처럼 해당 변수를 사용하려고 시도하면 '할당 전'이라는 오류 메시지가 나타난다.
변수 타입에 undefined가 포함되어 있는 경우에는 오류가 보고되지 않는다.
타입 별칭
타입 별칭(type alias)은
type 새로운 이름 = 타입
형태를 갖는다. 편의상 타입 별칭은 파스칼 케이스로 이름을 지정한다.타입 별칭은 타입 시스템의 '복사해서 붙여넣기'처럼 작동한다.
타입 별칭은 타입 애너테이션처럼 자바스크립트로 컴파일되지 않는다.
타입 별칭은 다른 타입 별칭을 참조할 수 있고 사용 순서대로 선언할 필요는 없다.
생각
타입 가드는 타입스크립트에서뿐만 아니라 자바스크립트에서도 유용하다는 생각이 든다. 타입 가드를 사용하면 자바스크립트에서도 안전하게 의도한 대로 코드를 작성할 수 있다. 생각해 보니 앞으로 접하게 될 동적 타입 언어에서도 도움이 될 거 같다.
이번 장에 있는 내용 중 유니언 속성과 참 검사를 통한 내로잉 부분은 읽어서 이해될 거 같지는 않다. 앞으로 타입스크립트를 많이 사용하다 보면 체화될 영역인듯 싶다.