node.js - Typescript-fel: Detta uttryck kan inte anropas. Typen 'typeof import("koa-session")' har inga anropssignaturer


Delvis löst:

Det finns ett gammalt problem på GitHub där detta problem beskrivs lite. När du deklarerar en modul i ett globalt utrymme, skriver den om hela den exporterade modulens typer. När du deklarerar en modul inuti en modul, slås de samman. Varför? Jag har ingen aning

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

Jag vill utöka en tredjepartsmoduls typ genom gränssnittssammanslagning. Allt fungerar bra, men när jag kommenterar export {}; i types.d.ts får jag följande fel:

Detta uttryck kan inte anropas. Typen 'typeof import("koa-session")' har inga anropsignaturer

Kan du förklara varför det händer?

Du kan kolla den fungerande koden här: https://codesandbox.io/s/typescript-node-nocfq?file=/src/types.d.ts

Svar #1

Ett liknande problem har tagits upp på TypeScripts GitHub. Tyvärr känner jag inte till någon annan dokumentationssida som skulle beskriva det.

Att kommentera ut export {} förvandlar types.d.ts-filen från en modul till ett script. Från TypeScript-handboken:

I TypeScript, precis som i ECMAScript 2015, anses varje fil som innehåller en toppnivåimport eller export vara en modul. Omvänt behandlas en fil utan några toppnivåimport- eller exportdeklarationer som ett skript vars innehåll är tillgängligt i den globala omfattningen (och därför även för moduler).

Eftersom filen utan export-sats (och utan import-sats) inte är en modul utan snarare ett skript har den ingen information om några moduler och kommer faktiskt att bortse från det faktum att det finns en befintlig definition för "koa-session".

Du kan prova detta i din sandlåda - att lägga till vilken som helst toppnivå import eller export i types.d.ts (den kan vara helt oanvänd) kommer att fixa Detta uttryck kan inte anropas-felet.

Svar #2

Du behöver importera gränssnittet om du vill förbättra det och göra gränssnittsammanslagning. Det du gör är att skriva om det helt.

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

Gör bara detta så kommer du att förbättra gränssnittet precis som du vill.

Relaterade artiklar