• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

npm library 인터페이스에 타입 추가하기

23.05.14 11:03 작성 조회수 303

0

구글맵 로딩을 위해

@googlemaps/js-api-loader

로딩된 구글맵 타입을 위해

@types/google.maps

를 사용중인데요.

제가 구글맵의 MVCObject와 InfoWindow라는 Interface에 저만의 프로퍼티나 메서드를 추가하고싶은데 이에따른 타입스크립트를 어떻게 작성해야할지 몰라서 질문드려요.

google.maps.InfoWindow에 isOpened 같은 메서드를 추가하여, 생성된 모든 infoWindow 인스턴스들이 isOpened를 갖게 해주고 싶었어요.

그래서 일단 @ts-ignore를 사용해서 google.maps.InfoWindow.prototype.isOpened 로 추가하고, 사용하니까 되긴 하더라고요. 근데 이에 대해 타입스크립트를 어떻게 작성해야할지 조사를 해봐도 잘 모르겠어요.

서드파티 라이브러리 타입 추가를 위해 d.ts 파일 만들어서 module augmentation이라는걸 하면 된다고 하는데, 예시도 많지 않고, 선임도 없고, 이것저것 해봤는데 실패만 해서, 질문 드려요. 부탁드립니다...

답변 2

·

답변을 작성해보세요.

0

안녕하세요, 좋은 질문이네요. 질문하신 내용을 마침 곧 출간되는 TS 책에 써두었는데 보여드릴 수가 없어서 넘 아쉽습니다 ㅜㅜ

아 그리고 밑에 보니 AI 봇이 대답한 답변도 괜찮은 것 같아요 ㅋㅋ 프로젝트 루트 레벨에 project.d.ts와 같은 파일을 만든 후 declare module 형태로 이미 정의되어 있는 google.maps 타입 선언 파일을 확장하시면 됩니다. 이렇게 하시려면 google.maps 타입 선언 파일 내부를 확인하셔서 어느 부분을 확장하셔야 할지 살펴보셔야 할거예요 :)

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.05.24

안녕하세요, 인프런 AI 인턴이에요.

서드파티 라이브러리 타입을 추가하기 위해서는 module augmentation을 사용해야 합니다. 이를 위해서는 우선 google.maps.InfoWindow 인터페이스를 정의한 d.ts 파일이 필요합니다.

아래의 예시 코드를 참고하시면 도움이 될 것입니다.

// custom.d.ts
declare namespace google.maps {
  interface MVCObject {
    myCustomProp: string;
  }

  interface InfoWindow {
    isOpened: boolean;
  }
}

이제, 위에서 정의한 인터페이스를 module augmentation을 통해 기존 타입에 추가할 수 있습니다.

// google.maps.d.ts
import '@googlemaps/js-api-loader';

declare module '@googlemaps/js-api-loader' {
  interface google {
    maps: {
      MVCObject: google.maps.MVCObject & { myCustomProp: string };
      InfoWindow: google.maps.InfoWindow & { isOpened: boolean };
    }
  }
}

위 코드에서 ‘@googlemaps/js-api-loader’는 타입을 추가하고자 하는 모듈명으로 변경해주시면 됩니다. 위에서 구현한 코드를 작성하면, google.maps.InfoWindow 인터페이스에 isOpened 프로퍼티가 추가됩니다.

그러나, 주의할 점은 이 방법은 외부 라이브러리의 타입을 직접 수정하는 것이 아니므로, 변경된 타입이 여러 버전의 라이브러리에서 모두 적용되는 것은 보장할 수 없다는 것입니다.

위의 방법을 참고하여 타입을 추가해보시고, 추가적인 질문이 있다면 언제든지 물어봐주세요. 감사합니다.