node.js - tsc härleder felaktigt ett extra .default-omslag vid standardimport av ett paket
Jag försöker importera [email till mitt ESM-projekt, men tsc föreslår ett extra .default-omslag runt det default-importerade paketet jsbi, vilket visar sig vara felaktigt vid körning.
import JSBI from 'jsbi';
// error: TS2339: Property 'BigInt' does not exist on type
// However this works as expected at runtime
console.log(JSBI.BigInt(1))
// This is what tsc suggests instead, but is actually 'undefined' at runtime
console.log(JSBI.default.BigInt(1))
- Jag försökte titta i det publicerade
jsbi-paketet och kunde inte identifiera boven. - Jag försökte byta
moduleResolutiontill bundler och det fungerar, men jag kan inte lista ut vad som orsakar att Node16/NodeNext-upplösningen går fel.
Kan någon hjälpa mig att identifiera grundorsaken här? Tack!
Här är några relaterade filer.
tsconfig.json
{
"compilerOptions": {
"esModuleInterop": true,
"module": "NodeNext",
"moduleResolution": "NodeNext",
"target": "ES2022",
"outDir": "dist",
"strict": true
},
"include": ["src"],
"exclude": ["node_modules", "dist"]
}
package.json
{
"name": "issue-import-jsbi",
"version": "1.0.0",
"main": "index.js",
"type": "module",
"dependencies": {
"jsbi": "3.2.5"
},
"devDependencies": {
"typescript": "^5.7.2"
}
}
jsbi/package.json
{
"name": "jsbi",
"version": "3.2.5",
"repository": "GoogleChromeLabs/jsbi",
"main": "dist/jsbi-cjs.js",
"module": "dist/jsbi.mjs",
"browser": "dist/jsbi-umd.js",
"types": "jsbi.d.ts",
"files": [
"dist",
"jsbi.d.ts"
],
"license": "Apache-2.0",
...
}
jsbi/jsbi.d.ts
export default class JSBI {
static BigInt(from: number|string|boolean|object): JSBI;
...
}
Svar #1
Det ser ut som att jsbi 3.2.5 levereras med felkonfigurerade typdeklarationer. I jsbi.d.ts deklarerar den en ESM-standardexport med export default class JSBI, men huvudingångspunkten (dist/jsbi-cjs.js) använder module.exports=JSBI. Typdeklarationen vilseleder TypeScript, vilket får det att tro att en extra .default-egenskap krävs.
För mer information, se:
- Problem #96 i jsbi GitHub
- Moduler - ESM/CJS interoperabilitet i TypeScript-dokumentationen
- Felaktig standardexport i arethetypeswrong GitHub
Detta problem finns fortfarande i jsbi 4.3.0, den senaste versionen vid tidpunkten för skrivande.
En tillfällig lösning som dyker upp är att lägga till en anpassad typdeklaration till ditt projekt för att åsidosätta den felaktiga. Till exempel verkade en index.d.ts med följande innehåll fungera för mig:
import JSBI from "jsbi";
declare module "jsbi" {
export = JSBI;
}
