Для объектов конфигурации теперь в основном пишу {...} satisfies Config вместо const config: Config = {...}. С аннотацией config.mode читается как 'light' | 'dark', хотя написано 'dark'. С satisfies объект проверяется на соответствие Config, а переменная сохраняет литеральные типы, с которыми её написали. Поэтому config.mode остаётся 'dark', и сравнение с 'light' где-то дальше становится ошибкой типов, а не мёртвой веткой.
Опечатку в имени свойства литерала ловят оба варианта. В заметках к 4.9 это показано на ключе bleu, который проверяют против Record<Colors, string | RGB>.
Подвела меня таблица маршрутов, записанная как satisfies Record<string, Route>. Там опечатка в имени маршрута - не лишнее свойство. Разрешён любой строковый ключ, проверка проходит, и опечатка превращается в маршрут, на который никто не ссылается. У аннотации та же дыра. Просто с satisfies казалось, что проверок больше, чем было на самом деле.
Если набор ключей фиксирован, теперь выписываю объединение явно, Record<RouteName, Route>, и пусть объект падает, когда в нём заводится чужак.