Выбор ответа Middle Условные и mapped-типы обновлено

Фильтрация ключей через as

Вопрос

Какой тип у S?

type OnlyStrings<T> = {
  [K in keyof T as T[K] extends string ? K : never]: T[K];
};
type S = OnlyStrings<{ id: number; name: string; email: string }>;

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

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

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

Коротко

Правильный ответ: { name: string; email: string }. Если в as ключ превращается в never, такое поле выбрасывается из результата. id имеет тип number, не проходит условие и исчезает.

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

  1. { name: string; email: string }правильный ответ
  2. { id: never; name: string; email: string }
  3. { id: number; name: string; email: string }
  4. 'name' | 'email'

Разбор

Если в as ключ превращается в never, такое поле выбрасывается из результата. id имеет тип number, не проходит условие и исчезает. Остаются строковые поля.

Поле с типом never получилось бы, если бы условие стояло в значении, а не в ключе. Объединение ключей дала бы конструкция с индексом [keyof T] в конце.

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

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