Выбор ответа Senior Объединения и сужение обновлено

satisfies, аннотация или as

Вопрос

Нужно проверить, что в routes все значения корректны, и при этом сохранить литеральные ключи для keyof typeof routes. Какой вариант подходит?

type Route = { path: string; auth: boolean };

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: const routes = { ... } satisfies Record<string, Route. satisfies (TS 4.9) проверяет значение против типа, но оставляет выведенный тип, поэтому ключи остаются литеральными, а лишнее или неверное поле даст ошибку.

Варианты ответа

  1. const routes: Record<string, Route> = { ... }
  2. const routes = { ... } as Record<string, Route>
  3. const routes = { ... } satisfies Record<string, Route>правильный ответ
  4. const routes = <Record<string, Route>>{ ... }

Разбор

satisfies (TS 4.9) проверяет значение против типа, но оставляет выведенный тип, поэтому ключи остаются литеральными, а лишнее или неверное поле даст ошибку. Аннотация расширяет тип до Record<string, Route> и keyof становится string. as и угловые скобки это утверждения: они не проверяют полноту и пропускают ошибки, если типы «достаточно похожи».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.