개발새발
타입스크립트는 건망증이 심하다 본문
타입스크립트에서 에러를 캐치할 때, 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를 이용해 타입을 안전하게 좁히자.
'Typescript' 카테고리의 다른 글
배운 것을 바탕으로 타입을 만들어보자 (0) | 2025.04.11 |
---|---|
원시 자료형에도 브랜딩 기법을 사용할 수 있다 (0) | 2025.04.03 |
추가적인 타입 검사에는 satisfies 연산자를 사용하자 (0) | 2025.04.03 |
정교한 문자열 조작을 위해 템플릿 리터럴 타입을 사용하자 (1) | 2025.04.03 |
자기 자신을 타입으로 사용하는 재귀 타입이 있다 (0) | 2025.04.02 |