kyucumber
전체 글 보기

Typescript에서 instanceof가 의도대로 동작하지 않는 경우

프로젝트 내에서 기본 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", }

Reference

Table of contents