javascript - Hvordan importere den samme npm-modulen i mer enn én TypeScript-fil?


Spørsmål :

Når jeg importerer den samme npm-modulen i mer enn én TypeScript-fil, får jeg feilen "error TS2451: Cannot redeclare block-scoped variable 'os'" så snart jeg kjører TypeScript-kompilatoren tsc. Oppsettet av prosjektet mitt vises nedenfor.

Jeg bruker NodeJS v18.15.0.


Oppsett :

Katalogstruktur

Project_Root
├─ main.ts
├─ worker.ts
├─ package.json
└─ tsconfig.json

main.ts

const worker = require('./worker');
const os = require('os');

console.log('name = ' + worker.getName() );
console.log('memory = ' + os.freemem() );

worker.ts

const os = require('os');

module.exports =
    class worker {
        static getName() : string { return "worker-" + os.freemem(); }
    }

package.json

{
  "devDependencies": {
    "@types/node": "^18.15.11",
    "typescript": "^5.0.3"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "sourceMap": false
  },
  "exclude": ["node_modules"]
}

Prosjektkrav:

  • Krav #1: Ingen eksterne pakker (RequireJS/Babel/Webpack/etc), siden lagringsplassen er begrenset.
  • Krav #2: IDE Intelli-sense bør fungere. Vi kan bruke hvilken som helst IDE.
  • Krav #3: Vi må bruke CommonJS-stilen "require" nøkkelord for importering.

Hva jeg har prøvd:

Jeg har prøvd de tre beste svarene i de følgende innleggene uten hell:

Relaterte innleggResultat
Feil TS2451: Kan ikke erklære blokkomfattende variabel '$' på nyttSamme feil (etter å ha lagt til flagget «skipLibCheck: true»)
Hvordan løser man dette Kan ikke erklære på nytt blokkbegrenset variabel 'ngDevMode'?Ikke aktuelt (jeg bruker ikke Angular)
TS2451: Kan ikke deklarere blokk-avgrenset variabel på nyttIkke aktuelt (jeg bruker ikke ESLint)
Får byggefeil i Angular CLI: Kan ikke erklære variabel med blokkomfang 'ngDevMode' på nyttIkke aktuelt (jeg bruker ikke Angular)
Importer npm JS-modul i TypeScriptIkke aktuelt (jeg bruker ikke Electron)

Svar #1

Dette er fordi TypeScript ikke anser de to filene som moduler, og får dem til å dele omfanget sitt. Du kan bruke moduleDetection-feltet i tsconfig for å tvinge dem til å bli gjenkjent som moduler:

{
  "compilerOptions": {
    "moduleDetection": "force"
  }
}

Det pågår en diskusjon om dette på TS GitHub-repositoriet

Relaterte artikler