There was no such type, and Shell.svelte rendered every app as any — so nothing was
checked across the one boundary every app crosses. It showed: five apps declared a bare
$props(), and of the seven that typed onback, Camera made it required and the rest
optional. Nothing could tell you which was right.
It is required. The shell passes onback={goHome} unconditionally on every render,
so an app receiving nothing is not a state that exists, and declaring it optional forced
onback?.() at every call site to guard against a case the shell cannot produce.
Deep-link props are the app's own, and it should say so by extending this:
let { onback, mailId } = $props<AppProps & { mailId?: number }>();
Keep those optional. A deep link is one way in among several, and the same component
still has to render when opened from the launcher with nothing.
What the shell hands an app component.
There was no such type, and
Shell.svelterendered every app asany— so nothing was checked across the one boundary every app crosses. It showed: five apps declared a bare$props(), and of the seven that typedonback, Camera made it required and the rest optional. Nothing could tell you which was right.It is required. The shell passes
onback={goHome}unconditionally on every render, so an app receiving nothing is not a state that exists, and declaring it optional forcedonback?.()at every call site to guard against a case the shell cannot produce.Deep-link props are the app's own, and it should say so by extending this:
Keep those optional. A deep link is one way in among several, and the same component still has to render when opened from the launcher with nothing.