For config objects I've mostly moved from const config: Config = {...} to {...} satisfies Config. With the annotation, config.mode reads back as 'light' | 'dark' even though I wrote 'dark'. With satisfies, the object is checked against Config and the variable keeps the literal types it was written with, so config.mode is 'dark', and comparing it to 'light' later is a type error instead of a dead branch.
Both forms still flag a misspelled property on the literal. The 4.9 notes show it with a bleu key checked against Record<Colors, string | RGB>.
Where it fooled me was a routes table written as satisfies Record<string, Route>. A misspelled route name isn't an excess property there. Every string key is allowed, so the check passes and the typo turns into a route nobody links to. The annotation has the same hole. satisfies just made me feel more checked than I was.
For a fixed set of keys I now spell the union out, Record<RouteName, Route>, and let the object fail when it grows a stranger.