Дискриминированное объединение это union объектов, у которых есть общее поле с литеральным типом. По значению этого поля (его называют дискриминантом или тегом) компилятор понимает, какой именно вариант перед ним.
Компилятор ругается на result.data: у варианта Failure такого поля нет, а функция принимает оба варианта. Общее у них только status, и обратиться без проверки можно лишь к нему.
Ключевая деталь в том, что status размечен не как string, а как конкретные литералы "success" и "error". Благодаря этому сравнение result.status === "success" работает как сужение типа: в одной ветке остаётся Success со своим data, в другой Failure со своим message.
Тесты проверяют оба случая: для результата со статусом "success" функция должна вернуть данные, для статуса "error" сообщение об ошибке.
Перепиши тело handle так, чтобы для успешного результата возвращались данные, а для неуспешного текст сообщения. Типы Success, Failure, Result и сигнатуру функции менять не нужно.