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

Опечатка в Omit и Pick

Вопрос

Какая строка не скомпилируется?

type User = { id: number; email: string };

type A = Omit<User, 'emial'>;  // A
type B = Pick<User, 'emial'>;  // B

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

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

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

Коротко

Правильный ответ: Только B. Pick<T, K extends keyof T требует, чтобы ключи были ключами T, поэтому опечатка в B даёт ошибку.

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

  1. Только A
  2. Только Bправильный ответ
  3. Обе строки
  4. Ни одна

Разбор

Pick<T, K extends keyof T> требует, чтобы ключи были ключами T, поэтому опечатка в B даёт ошибку. А у Omit ограничение K extends keyof any, то есть любая строка, число или символ. Omit<User, 'emial'> компилируется молча и просто ничего не убирает: поле email остаётся.

Это частая причина багов при переименовании полей. Строгий вариант пишут сами: type StrictOmit<T, K extends keyof T> = Omit<T, K>.

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

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