major
#29646
TL Views: Der Build der React-Client-Module prüft die TypeScript-Typen nicht, in com.top_logic.layout.react sind dadurch 29 Typfehler aufgelaufen
Kontext
Die React-Client-Module (com.top_logic.layout.react und die davon abhängigen Module wie …chartjs, …wysiwyg, …codeedit, com.top_logic.model.search.react, com.top_logic.react.flow.server) werden über das frontend-maven-plugin mit npm run build gebaut. Das build-Skript ruft nur vite build auf (in com.top_logic.layout.react: vite build --config vite.config.bridge.ts && vite build --config vite.config.controls.ts). Vite transpiliert TypeScript über esbuild und prüft dabei keine Typen. Ein Typfehler bricht den Build daher nicht ab und fällt weder lokal noch in Jenkins auf.
Befund
tsc --noEmit -p tsconfig.json in com.top_logic.layout.react meldet auf master (Stand 530c6cc9e9) 29 Fehler:
- 24× TS2322: Type 'unknown' is not assignable to type 'ReactNode' – Zustandswerte aus useTLState() (Typ Record<string, unknown>) werden ungeprüft als Kindelement gerendert, z.B. TLAdaptiveDetail.tsx:57, TLAnchor.tsx:19, TLAppBar.tsx:38/58, TLAppShell.tsx:52/57/67, TLDeckPane.tsx:24, TLDrawer.tsx:118, TLInset.tsx:20, TLMenuRegion.tsx:72, TLPanel.tsx:151/157/207, TLSidebar.tsx:620/627/662/690, TLTabBar.tsx:51, TLTableView.tsx:1526/1541, TLWindow.tsx:335/384.
- 3× TS2322: Type '{}' is not assignable to type 'number'/'string' – TLAudioPlayer.tsx:18, TLDownload.tsx:18/19.
- 2× TS2322: Type 'RefObject<HTMLButtonElement | null>' is not assignable to type 'RefObject<HTMLButtonElement>' – TLColorInput.tsx:89, TLIconSelect.tsx:88.
- 1× TS2352 – bridge/sse-client.ts:316, Umwandlung von Window & typeof globalThis nach Record<string, unknown>.
In den übrigen Client-Modulen (…chartjs, …codeedit, …wysiwyg, com.top_logic.react.flow.server) tritt jeweils nur der sse-client.ts-Fehler auf (über die Pfadabbildung von tl-react-bridge). com.top_logic.model.search.react meldet zusätzlich 4 Fehler: Die vite.config.ts bildet @codemirror/language, @lezer/highlight und @lezer/lr per Alias auf die Laufzeit des tl-code-editor-Bundles ab; tsc kennt diese Aliase nicht und sieht deshalb zwei verschiedene CodeMirror-Kopien (3× TS2322 in TLScriptEditor.tsx). Außerdem fehlt eine Typdeklaration für den *.grammar-Import des Lezer-Plugins (TS2307 in tlscript-lang.ts).
Erwartetes Verhalten
- Der Maven-Build der React-Client-Module führt eine Typprüfung (tsc --noEmit) aus, und ein Typfehler lässt den Build fehlschlagen.
- Die aufgelaufenen Fehler in allen Client-Modulen sind behoben.
Hinweis
Viele der unknown → ReactNode-Fehler entstehen, weil der Komponentenzustand untypisiert gelesen wird. Ticket #29643 führt typisierte Zustandsverträge (useTLState<ButtonState>(), generiert über msgbuf) für die ersetzbaren Blatt-Komponenten ein. Für die hier betroffenen Container-Komponenten (Panel, Fenster, Sidebar, …) behebt das die Fehler nicht; sie werden hier behoben.
Lösung
- Jedes Client-Modul hat ein npm-Skript typecheck (tsc --noEmit -p tsconfig.json); das build-Skript ruft es vor vite build auf. Damit schlägt sowohl der Maven-Build als auch ein lokales npm run build bei einem Typfehler fehl.
- Die Fehler sind ohne any/`@ts-ignore` behoben: Kind-Controls aus dem Zustand werden über !!x && <TLChild …/> bedingt gerendert, skalare Zustandswerte an der Lesestelle auf ihren Typ eingeschränkt, die anchorRef-Props der Farb- und Symbol-Popups akzeptieren RefObject<… | null>, und sse-client.ts liest das per Namen adressierte globale Objekt über eine lokale Aufweitung von window auf object.
- com.top_logic.model.search.react importiert LRLanguage, LanguageSupport, styleTags, tags und die Callback-Typen CompletionContext, CompletionResult, EditorView direkt aus tl-code-editor (dessen Einstiegsmodul exportiert die Typen dazu); die Alias-Shims für @codemirror/language und @lezer/highlight sowie die nicht mehr benötigten devDependencies entfallen. *.grammar-Module sind in react-src/lang/grammar.d.ts deklariert.