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...
