Выбор ответа 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 даёт ошибку.
Варианты ответа
- Только A
- Только Bправильный ответ
- Обе строки
- Ни одна
Разбор
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 ошибок.