После find значение остаётся объединением PaymentSuccess | PaymentFailed. Проверять errorCode напрямую нельзя: сначала сузьте тип через оператор in.
type PaymentSuccess = {
После 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.