개발새발

타입스크립트는 건망증이 심하다 본문

Typescript

타입스크립트는 건망증이 심하다

비숑주인 2025. 4. 3. 17:06

타입스크립트에서 에러를 캐치할 때, catch 블록의 error 변수는 기본적으로 unknown 타입이다. 즉, error를 그대로 사용하면 error.message와 같이 속성에 접근할 수 없으며, 강제로 as 연산자를 사용해 Error 타입으로 주장하더라도, 그 주장은 if문 평가 시점에만 일시적으로 적용된다.

try {
  // ...
} catch (error) {
  if (error) {
    error.message; // 에러: Property 'message' does not exist on type 'unknown'
  }
  
  if (error as Error) {
    error.message; // 여전히 에러 발생: 'error' is of type 'unknown'
  }
}

 

위 코드에서 if문 내부에 (error as Error)를 사용하더라도, 이후 줄에서는 error가 여전히 unknown 타입으로 취급된다. 이는 as 연산자의 효과가 일시적이기 때문이다. 이 문제를 해결하려면, 강제 주장을 변수에 담아 지속적으로 사용해야 한다.

 

try {
  // ...
} catch (error) {
  const err = error as Error; // err 변수는 Error 타입으로 지정된다.
  if (err) {
    err.message; // 이제 정상적으로 에러 메시지에 접근할 수 있다.
  }
}

 

가장 좋은 방법은 as를 사용하지 않고 instanceof 연산자를 활용하는 것이다. Error 클래스의 인스턴스인 경우라면 다음과 같이 작성할 수 있다.

 

try {
  // ...
} catch (error) {
  if (error instanceof Error) {
    error.message; // error는 Error 타입으로 자동 추론된다.
  }
}

 

결론적으로, 타입을 강제로 주장할 때 그 주장은 일시적이므로, 변수를 통해 유지하는 것이 중요하며, 가능하다면 instanceof를 이용해 타입을 안전하게 좁히자.