# \[S15] Narrowing

TS의 핵심

명확하지 않은 타입이 있을 때 (유니온 타입) 타입을 좁히는 과정

**typeof Guards**

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2FUTyLDIQ4IwHMfRhGt6RL%2Fimage.png?alt=media&#x26;token=096cfaa8-9c63-426f-a741-953498f1f0c7" alt=""><figcaption></figcaption></figure>

typeof를 활용해 특정 타입에 대한 동작을 설정한다

**Truthiness Guards**

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2F5NDrNtJTQIqYSgO3hdAz%2Fimage.png?alt=media&#x26;token=da86ef37-549a-47fc-9fa6-0568c571642e" alt=""><figcaption></figcaption></figure>

타입 유무를 통해 설정한다.

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2F56I3K5HcVUC8Gh9mWY7I%2Fimage.png?alt=media&#x26;token=6eaeb054-90db-415c-b44b-81c872df1e6d" alt=""><figcaption></figcaption></figure>

매개변수가 존재하면 문자열, 없으면 null 이라는 조건을 활용해 타입별 동작을 설정한다.

**Equality Narrowing**

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2FGJnAMTRyLY1tsn3CUnHt%2Fimage.png?alt=media&#x26;token=444fecb1-88b8-4a45-bb3f-1a99cc59949f" alt=""><figcaption></figcaption></figure>

동등 연산자를 사용해 타입을 좁힌다.

x의 타입과 y의 타입에서 동일한 부분은 string 이라는 점을 이용한다.

**in Narrowing**

객체의 성질을 사용해 타입을 좁힌다.

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2Fbae3LSdy5hzWnQh5YFLN%2Fimage.png?alt=media&#x26;token=d6d59ad8-69e8-4b31-895c-d636efbe67e8" alt=""><figcaption></figcaption></figure>

2개의 인터페이스에서 특정할 수 있는 속성을 확인해 타입을 좁힌다.

타입에 맞는 동작을 설정한다.

**instanceof Narrowing**

instanceof 연산자의 특징을 사용해 타입을 좁힌다.

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2FWKNBclV7XAFpA9IV2cdy%2Fimage.png?alt=media&#x26;token=73f6ae2b-dbd9-4d09-9d50-8a9e3604ecb0" alt=""><figcaption></figcaption></figure>

date 의 프로토타입 체인 안에 Date 가 있으면 Date 타입

아니면 string

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2Fd5NhfDc0MbT6xu8ORyrn%2Fimage.png?alt=media&#x26;token=727c3868-c266-432f-9f3d-298101c4aad5" alt=""><figcaption></figcaption></figure>

entity 의 프로토타입 체인 안에 User 가 있으면 User 타입

아니면 Company

**타입 명제**

타입 스크립트에만 있는 기능 is OO

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2FNWV6bHPuFRWf5LOp2CZl%2Fimage.png?alt=media&#x26;token=25b3fc43-b1c1-4655-bd8f-448da26da0f5" alt=""><figcaption></figcaption></figure>

Cat 인터페이스 / Dog 인터페이스

타입 명제 - animal 이 캣일때 참이 리턴되는 함수

함수를 활용해 참이면 Cat 타입 아니면 Dog 타입

**판별 유니온**

공통 프로퍼티를 공유하는 여러 유형을 설정하고 해당 프로퍼티가 리터럴 값이 되는 것

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2Fq6blA27DtahRrrrSGjes%2Fimage.png?alt=media&#x26;token=48812af6-82f8-4c45-8b71-900310ccbe53" alt=""><figcaption></figcaption></figure>

수탉 인터페이스, kind = “수탉”

소 인터페이스, kind = “소”

돼지 인터페이스, kind = “돼지”

타입 - 인터페이스의 집합

kind 값으로 타입을 확인해 분기

**Exhaustiveness check & Never**

이론적으로 도달할 수 없는 곳에 Never를 설정해 의도하지 않은 로직 발생시 에러를 발생시킨다.

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2FquJFhSzFSj0xxCNYUWkU%2Fimage.png?alt=media&#x26;token=d71a2d1f-0d06-4e28-bff9-35b6003ce4c8" alt=""><figcaption></figcaption></figure>

양 인터페이스

양 타입을 처리하지 않아 default 까지 내려옴

never로 되어있어 에러 발생
