Импорт модуля Typescript — нет автозавершения в архитектуре вложенного проекта/npm-workspaces

У меня довольно сложная установка с множеством распределенных пакетов npm, которые требуют друг друга. Я постарался максимально разобрать. Настройка выглядит так (каждый подпроект имеет свой package.json):

      Project-root:
- package.json*
- /apps: - app1
         - app2
- /common
- /libs: - lib1
         - lib2

Приложения: каждое приложение является автономным и использует все библиотеки и общие библиотеки, каждое из которых имеет свой собственный package.json.

Общий: используется для общих компонентов, но только в приложениях (зависит от всех библиотек) .

Библиотеки: Частные npm-пакеты, используемые в других проектах и ​​в приложениях/общих, WIP и, следовательно, используемые/включаемые через клон npm-workspaces/git. Поскольку они добавляются через npminstall by workspaces

У меня проблема в том, что typescript/tsc выдает ошибку ts(2307) во всех классах в «общем» модуле.

импортировать { BarInterface } из '@mynamespace/lib1/foo';

Не удается найти модуль '@mynamespace/lib1/foo' или его соответствующие объявления типов.

Все работает как надо, а dev/build работает без ошибок, но Visual Studio Code/Intellisense и/или tsc не могут принимать предоставленные операторы импорта в общем. Поэтому автодополнение недоступно, на что мы очень полагаемся, поскольку проект должен быть легким для новых разработчиков.

* package.json (корень):

      {
  "name": "main-project",
  "workspaces": [
    "./apps/*",
    "./libs/*",
    "./common"
  ]    
}

* package.json (библиотека):

      {
  "name": "@mynamespace/lib1",
  "exports": {
    "./foo": "./src/foo/index.ts",
  },   
}

* package.json (общий):

      {
  "name": "main-project-common",
  "exports": {
    "./bar": "./src/bar/index.ts",
  },
  "dependencies": { 
    "@mynamespace/lib1": "^1.0.0"
    "@mynamespace/lib2": "^1.0.0"
  }   
}

* пакет.json (приложение1):

      {
  "name": "app1",
  "exports": {
    "./bar": "./src/bar/index.ts",
  },
  "dependencies": { 
    "@mynamespace/main-project-common": "file:../../common"
  }   
}

Все tsconfig.json-файлы выглядят так:

      {
  "compilerOptions": {
    "target": "es2018",
    "module": "esnext",
    "lib": ["es2017", "dom", "dom.iterable"],
    "declaration": true,
    "emitDeclarationOnly": true,
    "outDir": "./types",
    "rootDir": "./src",
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "experimentalDecorators": true,
    "forceConsistentCasingInFileNames": true,
    "useDefineForClassFields": false,
    "resolveJsonModule": true,
    "noImplicitAny": false
  },
  "include": ["src/**/*.ts", "global.d.ts"],
  "exclude": []
}

vite.config.js

      import { defineConfig } from 'vite';
import path from 'path';

// https://vitejs.dev/config/
export default defineConfig({
  build: {
    target: 'esnext',
    lib: {
      entry: path.resolve(__dirname, 'src/index.ts'),
      formats: ['es'],
    },
    rollupOptions: {
      external: /^lit/,
    },
  },
});

Я что-то упускаю, или настройка слишком сложная, или какой-то антишаблон, не поддерживаемый машинописи?

1 ответ

Я нашел проблему. Я пропустил объявление модуля common -module .

Добавление файла global.d.tsк /commonсо следующим содержанием решил проблему для меня.

      declare module '*';

Этот шаг необходим для каждого модуля машинописного текста.

Другие вопросы по тегам