type PaymentSuccess = {

После find значение остаётся объединением PaymentSuccess | PaymentFailed. Проверять errorCode напрямую нельзя: сначала сузьте тип через оператор in.

Короткий ответ

Что ответить на собеседовании

После find значение остаётся объединением PaymentSuccess | PaymentFailed. Проверять errorCode напрямую нельзя: сначала сузьте тип через оператор in.

Подробный разбор

Ответ с пояснениями

Условие

type PaymentSuccess = { orderId: string amount: number }

type PaymentFailed = { orderId: string errorCode: number retryable: boolean }

const transactions: (PaymentSuccess | PaymentFailed)[] = [ { orderId: '101', amount: 2500 }, { orderId: '102', errorCode: 403, retryable: true }, { orderId: '103', amount: 1200 }, ]

const found = transactions.find((tx: PaymentSuccess | PaymentFailed): boolean => tx.orderId === '102')

if (found) { if (found.errorCode) { if (found.retryable) { console.log(Ошибка ${found.errorCode}, пробуем еще раз) } } else { console.log(Успешный платеж на сумму: ${found.amount}) } }

Ответ

После find значение остаётся объединением PaymentSuccess | PaymentFailed. Проверять errorCode напрямую нельзя: сначала сузьте тип через оператор in.

Проверка truthy также ошибочна, если код ошибки может быть равен нулю.

if (found) {
  if ('errorCode' in found) {
    if (found.retryable) {
      console.log(`Ошибка ${found.errorCode}, пробуем еще раз`);
    }
  } else {
    console.log(`Успешный платеж на сумму: ${found.amount}`);
  }
}

Для приведённых данных выводится ошибка 403. Ещё более явный контракт можно построить на общем поле-дискриминаторе status.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее