프로젝트 내에서 기본 Error를 상속해 BaseError를 만들어 사용하고 있었습니다. 코드 내부에는 instanceOf를 통해 BaseError 타입인지 검증하는 코드가 포함되어 있었는데, 의도한 대로 동작하지 않는 문제가 발생했습니다.
export interface ErrorData {
status: number;
errorMessage?: string;
}
export default class BaseError extends Error {
status: number;
errorMessage: string;
constructor(errorData: ErrorData) {
super(errorData.errorMessage);
this.status = errorData.status;
this.errorMessage = errorData.errorMessage || '';
}
}
아래처럼 실제 BaseError임에도 불구하고 instanceof BaseError의 결과가 false가 떨어지는 문제가 있었습니다.
// true
if (res instanceof Error) {
}
// false
if (res instanceof BaseError) {
}
해결 방법
- 프로토타입을 수동으로 조정합니다.
export default class BaseError extends Error {
status: number;
errorMessage: string;
constructor(errorData: ErrorData) {
// ...
// 아래 부분 추가
Object.setPrototypeOf(this, BaseError.prototype);
}
}
- tsconfig의 target을 ES2015 이상으로 업그레이드 합니다.
tsconfig.json
{
"compilerOptions": {
"target": "es2015",
}