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"`
  }
}

Relaterade artiklar