Объект Typescript, возможно, «неопределен» с условием в переменной

#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. Похоже, это будет частично исправлено для будущего выпуска.