웹사이트 검색

node.js - Typescript 오류: 이 표현식은 호출할 수 없습니다. 타입 'typeof import("koa-session")'에는 호출 서명이 없습니다


부분적으로 해결됨:

깃허브에 이 문제가 조금 설명된 오래된 이슈가 있습니다. 전역 범위에서 모듈을 선언하면 전체 내보낸 모듈의 타입이 다시 작성됩니다. 모듈 안에 모듈을 선언하면 병합됩니다. 왜 그런지 저는 모르겠습니다

https://github.com/microsoft/TypeScript/issues/17736#issuecomment-344353174

인터페이스 병합을 통해 서드파티 모듈의 타입을 확장하고 싶습니다. 모든 것은 잘 작동하지만, types.d.ts에서 export {};를 주석 처리하면 다음과 같은 오류가 발생합니다:

이 표현식은 호출할 수 없습니다. 타입 'typeof import("koa-session")'에는 호출 시그니처가 없습니다

왜 그런 일이 일어나는지 설명해 주실 수 있나요?

여기에서 작동하는 코드를 확인할 수 있습니다: https://codesandbox.io/s/typescript-node-nocfq?file=/src/types.d.ts

답변 #1

유사한 문제는 TypeScript 깃허브에서도 다뤄진 바 있습니다. 불행히도, 이를 설명하는 다른 문서 페이지는 현재 제가 알고 있는 바 없습니다.

export {}를 주석 처리하면 types.d.ts 파일이 모듈에서 스크립트로 바뀝니다. TypeScript 핸드북에서:

TypeScript에서, ECMAScript 2015와 마찬가지로, 최상위 import나 export를 포함하는 모든 파일은 모듈로 간주됩니다. 반대로, 최상위 import나 export 선언이 없는 파일은 그 내용이 전역 범위(따라서 모듈에도)에서 사용할 수 있는 스크립트로 처리됩니다.

export 문이 없고 import 문도 없는 파일은 모듈이 아니라 스크립트이기 때문에 어떤 모듈에 대한 정보도 없으며, 'koa-session'에 대한 기존 정의가 존재한다는 사실을 실제로 무시할 것입니다.

샌드박스에서 이것을 시도해 볼 수 있습니다 - types.d.ts에 상위 수준의 import나 export를 추가하는 것(완전히 사용하지 않아도 됨)이 This expression is not callable 오류를 수정합니다.

답변 #2

인터페이스를 확장하고 인터페이스 병합을 하려면 인터페이스를 가져와야 합니다. 지금 하고 있는 것은 그것을 완전히 새로 쓰는 것입니다.

import Session from "koa-session";
declare module "koa-session" {
  interface Session {
    user: {
      id: number;
      username: string;
    };
  }
}

그냥 이 작업을 하면 원하시는 대로 인터페이스를 향상시킬 수 있습니다.

관련기사