/ TYPESCRIPT

Type Narrowing

TypeScript은 다음과 같이 구성되어 있습니다.

타입 좁히기 (Type Narrowing)

Type Narrowing

타입스크립트의 타입은 덜 정확한, 애매한 타입이 있을 수 있습니다. 하지만 타입스크립트는 엄격하기때문에 정확한 타입이 필요합니다. 그렇지 않으면 타입 에러가 발생하게 되죠. 이렇게 타입 에러를 막기 위해 Type Narrowing이 필요합니다.

Type Narrowing은 if문 등으로 타입을 하나로 정해주는 것입니다.

function myFun(x :number | string){
  if (typeof x === 'number') {
    return x + 1
  } 
  else if (typeof x === 'string') {
    return x + 1
  }
  else {
    return 0
  }
}

if문으로 타입을 나누지 않고 그냥 return x + 1 처리하면 에러가 발생합니다.
x는 number | string 타입이지 number 타입이나 string 타입이 아니라고 보면됩니다. 따라서 조건문으로 타입 별로 처리를 나눠주면 에러를 피할 수 있습니다.

위 코드처럼 조건에 typeof를 꼭 쓸 필요는 없습니다. 타입을 하나로 확정지을 수 있는 표현이라면 어떤 것도 Narrowing 역할을 할 수 있습니다. in, instanceof 등의 키워드도 사용이 가능합니다.

Type Assertion

물론 타입을 간편하게 assert할 수도 있습니다. Type Assertion 이라는 것을 사용하는 것인데, 변수 뒤에 as를 붙이는 것이죠.

변수명 as string

이렇게 쓰면 “이 변수의 타입을 string으로 생각해주세요”라는 뜻입니다. 하지만 실제로 타입을 바꿔주는 것은 아니기 때문에 조심해서 사용해야합니다. assertion을 남발하는 것은 좋지 않습니다.
as 키워드를 사용하면 다음과 같은 특징이 있습니다.

  1. as 키워드는 Union Type과 같은 복잡한 타입을 하나의 정확한 타입으로 좁혀주는 역할을 합니다.
    그래서 number타입인 변수를 as string 으로 바꾸려고한다면 에러가 발생합니다.

  2. 사실 임시로 타입을 해제시키는 용도입니다. 실제 코드의 실행결과는 as가 있을 때나 없을 때나 동일합니다.



정리하자면 as를 사용하면 간편하지만, 정확한 코드를 위해 Narrowing을 사용하는 것이 좋습니다. 왜 타입에러가 나는지 정말 모르겠을 때 임시방편으로 사용하거나, 내가 어떤 타입이 들어올지 확실하게 알고 있으나, 컴파일러 에러가 발생하는 경우 비상용으로 사용하면 되겠습니다.

End.