• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    미해결

express response 타입

24.04.26 06:41 작성 조회수 57

0

type JsonBody = {
  success: boolean;
  data: any;
};

declare global {
  namespace Express {
    export interface Response {
      json: (body: JsonBody) => this;
      test: (body: JsonBody) => this;
    }
  }
}

export {};

라이브러리 버전

express 4.18.2

@types/express 1.17.17

 

get, post 등 모든 요청에서 응답으로 res.status(200).json({success:true, data: []}) 이런 형식으로 코드 자동완성 기능 이용하려고 위와 같이 Express Response에 json 타입을 오버로딩 했는데 res.status(200).json 코드를 입력하면 오버로딩한 타입은 자동완성추천에 뜨지않고 express 자체에서 작성해둔 타입 json(body?: any): Response<any, Record<string, any>, number> 이런 타입만 뜹니다.

json 아래에 작성한 test는 res.status(200).test 작성시 자동완성 추천도 잘되고 객체에 success랑 data 입력하게 자동완성 기능이 잘 동작하는데 json만 동작이 안됩니다. 어떻게하면 해결할 수 있을까요?

답변 1

답변을 작성해보세요.

0

test 메서드는 기존에 없는 메서드를 추가한 것이라 declaration merging이 되는데, json 메서드는 기존에 있는 것을 덮어씌우는 것이라 안 됩니다. declaration merging으로는 기존 속성을 덮어씌울 수는 없습니다.

https://stackoverflow.com/a/66567805/4464863

이런 식으로 Response에 있는 Generic을 활용해서 json body를 타이핑하셔야 합니다.

haruharu님의 프로필

haruharu

질문자

2024.04.26

예시1

interface Add {
  (x: number, y: number): number;
  (x: string, y: string): string;
}

const add: Add = (x, y) => x + y;

예시2

declare function add(x: number, y: number): number;
declare function add(x: string, y: string): string;

예시1, 2 처럼 오버로딩해서 타입 작성하고 상황에 맞게 타입을 사용하는게 가능한걸로 아는데 두가지 예시랑 express 질문했던거랑은 다른건가요?

 

네 올려주신 건 오버로딩이고, 기존에 있는걸 덮어쓰는 건 선언 병합입니다. 다른 특성입니다.

기존 코드에

interface Add {

(x: number, y: number): strinf;

(x: string, y: string): number;

}

를 추가로 더 선언한 상황이라고 보시면 됩니다.