A | B
는 A
타입 이거나 B
타입인 타입을 나타낸다. 객체의 선택 속성 역시 유니온 타입의 특수한 경우라고 생각할 수 있다. 선택 속성 prop?: T
에서 prop
은 undefined
이거나 T인 타입이고, 이는 prop: T | undefined
와 유사하기 때문이다.prop?: T
와 prop: T | undefined
는 정확히 동일한 의미는 아니다. 후자는 prop
이라는 이름의 속성이 존재할 것을 보장하지만, 전자는 그렇지 않다. 아래 예제를 보면 그 차이가 쉽게 이해 될 것이다.A
시점에서 p.favoriteLanguage
의 타입은 당연히 string | undefined
다. 하지만 B
에서는 어떨까? if
문을 보면, p.favoriteLanguage
가 undefined
라면 함수는 이른 반환(early return)을 수행한다. 이 경우에는 실행 흐름이 B
에 도달하기 전에 함수를 빠져나간다. 따라서 실행 흐름이 B
에 도달했다면 p.favoriteLanguage
는 string
타입일 수 밖에 없다. 타입스크립트는 이러한 상황을 이해하여 위의 if
문 이후부터는 p.favoriteLanguage
의 타입을 string
으로 인식한다.if
문을 통해 string | undefined
라는 넓은 타입으로부터 string
이라는 좁은 타입으로의 타입 좁히기가 일어났다.B
이후로도 p.favoriteLanguage
를 사용하려 할 때마다 undefined
여부를 체크해줘야 할 것이다.if
, else if
, else
while
, for
switch
, case
break
, continue
return
undefined
또는 null
과의 비교는 각각 대응하는 타입에 대한 타입 가드로 동작한다. 아래 예제에서는 if
문에서의 null 체크가 타입 가드로 동작한다.Person.favoriteLanguage
예제 역시 undefined
와의 비교가 타입 가드로 동작한 경우다.employee.type
을 기반으로 switch
-case
를 통해 각 브랜치에서 employee
의 타입을 좁힐 수 있었다. 앞의 두 케이스가 가능한 모든 케이스를 처리했으므로 default
브랜치에서 employee
는 never
타입이 되는데, 이 역시 타입 좁히기 덕분이다.typeof
연산자는 하나의 인자를 받아 해당 인자의 타입을 나타내는 문자열을 반환한다. typeof
의 반환값과 문자열을 비교한 결과를 타입 가드로 사용할 수 있다. 공식 문서의 예제를 보자.typeof
연산자는 보통의 프로그래머의 예상과는 다르게 동작한다는 점을 주의해야 한다. 흔히 쓰이는 값의 타입과 typeof
연산자의 반환값을 보면 아래 표와 같다.typeof null
은 "null"
이 아닌 "object"
다. 또한 typeof [] === "array"
일 것이란 예상과 달리 배열을 나타내는 별도의 반환값은 존재하지 않는다. 이런 혼란스러운 동작 탓에 일반적으로 typeof
타입 가드는 boolean
, string
, number
, symbol
등 단순한 타입에 대해서만 사용하는 것이 권장된다.typeof
반환값in
연산자는 객체에 특정 속성이 존재하는지 여부를 확인할 때 사용된다.in
연산자의 결과 역시 역시 타입 가드로 쓸 수 있다.value is Type
형태의 반환 타입을 갖는 함수로 정의한다. 예를 들어 아래와 같이 isFish
사용자 정의 타입 가드를 정의해서 위의 doSomethingWithAnimal
함수를 고쳐 쓸 수 있다.