TypeScript tsc typesjekk med referanser i monorepoer


Jeg bruker Yarn Workspaces, og jeg ønsker en CLI-kommando for å sjekke typene til mine kildefiler i TypeScript som ligger i packages/*.

Opprinnelig bygde jeg prosjektet mitt ved å bruke webpack (med esbuild, som ikke sjekker typer) og sjekket typer med tsc --noEmit separat. Og de fungerte veldig godt sammen.

Etter å ha byttet til Yarn Workspaces delte jeg hele prosjektet mitt inn i noen få små pakker.

Hele prosjektet er slik:

packages/
  foo/
    index.ts          // import bar from 'bar'; console.log(bar);
    package.json      // { "name": "foo" }
    tsconfig.json     // { "references": [ { "path": "../bar" } ] }
  bar/
    index.ts          // export default "hello world";
    package.json      // { "name": "bar" }
    tsconfig.json     // { "compilerOptions": { "composite": true } }
package.json          // { "workspaces": [ "packages/*" ] }

Og så oppdaget jeg at tsc ikke kjørte. Når jeg prøver tsc --noEmit -p packages/foobar feiler det med en haug med feil som:

Output file '/packages/foobar/index.d.ts' has not been built from source file '/packages/foobar/index.ts'.

Men webpack fungerer veldig bra.

Etter å ha surfet på internett, fortalte det offisielle dokumentet meg at de to funksjonene bare kunne brukes i byggetilstand. Men når jeg prøvde tsc --noEmit -b packages/foobar, feilet det også på grunn av konflikter mellom --noEmit-flagget og byggetilstand. Dessuten, hvis jeg fjernet --noEmit-flagget, vil tsc prøve å generere en mengde .js-filer for meg, men jeg vil ikke at de skal genereres.

Jeg vil bare ha en CLI-kommando for å sjekke typer uten å generere noen ekstra filer, slik IDE-en min gjør. Hvordan kan jeg kjøre tsc riktig? Eller finnes det noen alternativer til dette?

Svar #1

Kom akkurat over det samme problemet, og "løste" det ved å bruke TS Project References, og jeg la til følgende i min tsconfig.json

"compilerOptions": {
  ...
  "emitDeclarationOnly": true,
  ...
}

Dette forteller Typescript-kompilatoren å ikke transpile noen av TS til JS, men bare generere .d.ts deklarasjonsfiler.

Deretter i min package.json:

scripts: {
   "lint": "tsc -b"
}
"

Dette vil bygge alle TS-prosjektreferanser og prosjektet du kjører tsc i. Men siden vi har 'emitDeclarationOnly' slått på, vil det kun bygge deklarasjonsfiler for dette prosjektet.

Svar #2

Prøv å legge til typescript som avhengighet i package.json til pakken du vil få sjekket.

(rediger): ser heller ikke ut til at tsc --noemit fungerer med prosjektreferanser...

Relaterte artikler