Код Junior Объединения и сужение спрашивают часто обновлено

isDefined: filter, который сужает тип

Условие

Напиши type guard isDefined<T>(v: T): v is NonNullable<T> и используй его в activeEmails(users): вернуть отсортированный список email активных пользователей, у которых email есть (поле может быть null или отсутствовать).

Цель по типам: users.map(u => u.email).filter(isDefined) должен иметь тип string[], без as и без !.

Примеры

activeEmails([{"name":"a","active":true,"email":"b@x.ru"}, {"name":"b","active":true,"email":null}, {"name":"c","active":false,"email":"c@x.ru"}, {"name":"d","active":true,"email":"a@x.ru"}]) // ["a@x.ru", "b@x.ru"]
activeEmails([]) // []
activeEmails([{"name":"a","active":true}]) // []

Как подойти

Подсказки: 2
  1. .filter(Boolean) выкинет и пустую строку, и до TS 5.5 не сужал тип.
  2. Проверяй именно null и undefined.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.