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 innlegg | Resultat |
|---|---|
| Feil TS2451: Kan ikke erklære blokkomfattende variabel '$' på nytt | Samme 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å nytt | Ikke aktuelt (jeg bruker ikke ESLint) |
| Får byggefeil i Angular CLI: Kan ikke erklære variabel med blokkomfang 'ngDevMode' på nytt | Ikke aktuelt (jeg bruker ikke Angular) |
| Importer npm JS-modul i TypeScript | Ikke 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
