Total Typescript - Unions and Narrowing

김동하·2025년 3월 16일
0

typescript

목록 보기
1/21

타입스크립트 제대로 공부하며 배운 것을 정리

1. literals to wider type

  • 리터럴 타입과 wider type을 함께 union으로 사용하는 경우다. 이렇게 되면 string 타입이 더 큰 집합을 가지기 때문에 다른 리터럴 타입들이 적용되지 않는다.

이렇게 되면 자동완성에도 리터럴 타입이 나오지 않는다.

이를 해결하기 위해 아래처럼 string & {} 를 추가해준다. string 타입의 객체임을 명시하면서 타입스크립트 컴파일러의 유니언 타입에서 타입 축소를 방지한다고 한다(정확한 원리는 모르겠음)

그럼 아래처럼 자동완성이 잘 나오게 된다.

2. map hasn't narrow map.get()

위 상황처럼 타입 narrowing을 통해 Map 의 에러에 접근하려고 한다. 하지만 error 객체를 찾지 못하는 타입 에러를 뱉는다.

이유는 타입스크립트는 Map.has()Map.get()의 관계성을 이해하지 못하기 때문이다.

이를 해결하기 위한 좋은 방법은 Map.get()으로만 타입 좁히기를 사용하는 것

3. narrowing unknown type

unknown 타입의 타입 좁히기를 해서 id를 return 해야하는 상황이다. value의 타입을 좁혔지만 여전히 data의 타입이 unknown인 상태다

이를 해결하기 위해서는 id 타입까지 타입 좁히기를 해줘야 한다.

이렇게까진 타입스크립트를 사용한 적이 없어서 반성했다...

4. narrowing different scope

searchParams 를 타입 좁히기한 상황이다. 하지만 여전히 searchParams.name에서 에러가 나오는 상황이다 (실무에서도 이런 경우가 좀 있었던 거 같다)

이러한 문제가 발생한 이유는 타입 좁히기는 타입 좁히기가 다른 스코프를 커버하지 않기 때문이다.

가령, 아래와 같이 타입을 좁힌 후 값이 변경될 가능성이 있기 때문에 다른 스코프의 타입 좁히기는 언제나 보장하지 않는다.

가장 좋은 방법은 해당 값이 mutable 하지 않다는 것을 타입스크립트에게 알려주는 것이다.

참고: total typescript

profile
프론트엔드 개발

0개의 댓글