Выбор ответа Senior Объединения и сужение обновлено
satisfies, аннотация или as
Вопрос
Нужно проверить, что в routes все значения корректны, и при этом сохранить литеральные ключи для keyof typeof routes. Какой вариант подходит?
type Route = { path: string; auth: boolean };
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: const routes = { ... } satisfies Record<string, Route. satisfies (TS 4.9) проверяет значение против типа, но оставляет выведенный тип, поэтому ключи остаются литеральными, а лишнее или неверное поле даст ошибку.
Варианты ответа
const routes: Record<string, Route> = { ... }const routes = { ... } as Record<string, Route>const routes = { ... } satisfies Record<string, Route>правильный ответconst routes = <Record<string, Route>>{ ... }
Разбор
satisfies (TS 4.9) проверяет значение против типа, но оставляет выведенный тип, поэтому ключи остаются литеральными, а лишнее или неверное поле даст ошибку. Аннотация расширяет тип до Record<string, Route> и keyof становится string. as и угловые скобки это утверждения: они не проверяют полноту и пропускают ошибки, если типы «достаточно похожи».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.