#typescript
Вопрос:
Я использую машинопись в строгом режиме, и иногда, чтобы повысить читабельность или намерение, я использую переменную для выражения сложного состояния.
К сожалению, когда мне нужно использовать опору для объекта, у меня возникает ошибка машинописи
type Input = {amount: number}
const getPaymentAmount = (payment?: Input) => {
// Any compound condition
const doesPaymentExists = true amp;amp; payment
return doesPaymentExists
? payment.amount // Here payment should be defined
: 0
}
Вы можете протестировать на детской площадке
У меня такая же проблема с охранником
type Input = {amount: number}
const isPayment = (payment?: Input): payment is Input => !!payment
const getPaymentAmount = (payment?: Input) => {
// Any compound condition
const doesPaymentExists = true amp;amp; isPayment(payment)
return doesPaymentExists
? payment.amount // Here payment should be defined
: 0
}
И конечно, если мы проверим объект в том состоянии, в котором он работает
type Input = {amount: number}
const getPaymentAmount = (payment?: Input) => {
// Any compound condition
const doesPaymentExists = true amp;amp; payment
return doesPaymentExists amp;amp; payment
? payment.amount // It works -_-
: 0
}
Знаете ли вы, почему typescript не может обнаружить существование payment
объекта из моей doesPaymentExists
переменной ?
Ответ №1:
Это хорошо известное поведение. Вы также можете проверить другие связанные с этим вопросы там.
Цитата из одного из выпусков:
Я не могу найти другие дубликаты, но мы только синтаксически проверяем, является ли isA определяемым пользователем типом защиты при проверке if (и в других синтаксических местах). Возвращаемый тип предиката типа на самом деле является просто логическим в любом другом контексте. Таким образом, oIsA не отслеживает никакой информации о типе самого o.
Мы рассмотрели эту проблему, но в целом она кажется довольно сложной и дорогостоящей для решения.
Я полагаю, что это не изменится в ближайшее время. Итак, ваш третий фрагмент кода-это правильный путь.
Комментарии:
1. Похоже, это будет частично исправлено для будущего выпуска.