typescript - UI balíček v Turborepo občas produkuje chybu TS - Nebyl nalezen deklarovaný soubor pro modul
Momentálně zkouším Turborepo a potýkám se s chybou TS, kterou se mi nedaří vyřešit.
Chybová zpráva zní:
Nelze najít soubor deklarace pro modul '@myapp/ui'. 'C:/myapp/packages/ui/dist/index.mjs' má implicitně typ 'any'.
Zkuste
npm i --save-dev @types/myapp__ui, pokud existuje, nebo přidejte nový deklarovaný (.d.ts) soubor obsahujícídeclare module '@myapp/ui';
Můj hlavní problém je, že se to děje nepravidelně. Někdy chyba je, a jindy po restartování TS serveru zmizí a pak zůstane pryč několik hodin.
Zde je struktura mého projektu:
.
├── apps
│ └── web
│ ├── src
│ │ └── [lang]
│ │ ├── layout.tsx
│ │ └── page.tsx
│ ├── package.json
│ └── tsconfig.json
├── packages
│ └── ui
│ ├── dist
│ ├── src
│ ├── package.json
│ ├── tsup.config.ts
│ └── tsconfig.json
├── package.json
└── turbo.json
Obsah mého souboru packages/ui/package.json:
{
"name": "@myapp/ui",
"version": "0.0.0",
"sideEffects": false,
"main": "./dist/index",
"types": "./dist/index.d.mts",
"exports": {
".": {
"import": {
"types": "./dist/index.d.mts",
"default": "./dist/index.mjs"
}
}
},
"scripts": {
"build": "tsup --format esm --minify",
"dev": "tsup --format esm --minify --watch",
"check-types": "tsx --noEmit",
"lint": "eslint src/ --max-warnings 0",
"ui:add": "pnpm dlx shadcn-ui@latest add"
},
"peerDependencies": {
"next": "^14.1.1",
"react": "^18.2.0"
},
"devDependencies": {
"@myapp/eslint-config": "workspace:*",
"@myapp/tailwind-config": "workspace:*",
"@myapp/typescript-config": "workspace:*",
"autoprefixer": "^10.4.16",
"eslint": "^8.57.0",
"postcss": "^8.4.38",
"tailwindcss": "^3.4.3",
"tsup": "^8.0.2",
"typescript": "^5.3.3"
}
}
Zkoušel jsem změnit „types“ na „dist/index“, což dočasně funguje, a pak se chyba znovu objeví, a naopak, pokud to změním na „dist/index.d.mts“.
Správný soubor index.d.mts je skutečně ve složce dist, a vše v něm vypadá správně.
Tady je můj tsup.config.ts:
import { defineConfig, Options } from "tsup"
export default defineConfig((options: Options) => ({
entry: ["src/**/*.tsx"],
format: ["esm"],
esbuildOptions(options) {
options.banner = {
js: '"use client"',
}
},
dts: true,
clean: true, // Clears the dist
external: ["react", "next-intl"],
...options,
}))