node.js - Typescript och subvägsimporter
Jag försöker få Node subpath-importer och Typescript att fungera. Min IDE har inga problem med att lösa importerna, men Typescript är aldrig nöjt.
Github-repo med kod: https://github.com/doronrosenberg/ts-subpath-imports.
package.json:
"imports": {
"#internal/*": "./internal/*.ts",
"#internal2": "./internal"
}
tsconfig.json:
"paths": {
"#internal/*": "./internal/*.ts",
"#internal2": ["./internal"]
}
och koden:
import { foo } from "#internal/index";
import { bar } from "#internal2";
Oavsett hur jag ställer in saker, får jag alltid:
src/test.ts:1:21 - error TS2307: Cannot find module '#internal/index' or its corresponding type declarations.
1 import { foo } from "#internal/index";
~~~~~~~~~~~~~~~~~
src/test.ts:2:21 - error TS2307: Cannot find module '#internal2' or its corresponding type declarations.
2 import { bar } from "#internal2";
~~~~~~~~~~~~
Några idéer?
Svar #1
Efter att ha meckat med Typescript i några veckor fick jag en fungerande lösning.
Säg att jag har ett paket som heter @kodadot1/metasquid med flera delmoduler (consolidator och entity).
I min package.json deklarerar jag imports
"exports": {
".": {
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
},
"./consolidator": {
"types": "./dist/consolidator.d.ts",
"import": "./dist/consolidator.mjs",
"require": "./dist/consolidator.cjs"
},
"./entity": {
"types": "./dist/entity.d.ts",
"import": "./dist/entity.mjs",
"require": "./dist/entity.cjs"
}
}
Tricket är att skapa en .d.ts-fil för varje undermodul i projektets rot.
Så för undermodulen entity kommer jag att skapa en fil som heter entity.d.ts som innehåller
export * from './dist/entity'
Nu, för att publicera det korrekt på npmjs, utöka din package.json så här:
"files": [
"dist",
"*.d.ts"
]
Nu publicerar du bara, och du kan njuta av subpath-importer:
import { get } from '@kodadot1/metasquid/entity'
Hela koden finns här
Svar #2
Stöd för undervägs-exporter kräver nyare modulupplösningar såsom Node16 och NodeNext:
{
"compilerOptions": {
"moduleResolution": "Node16" // or `"NodeNext"`
}
}
