javascript - 为什么我在这个可选链中收到 "Object is possibly ' undefined'"?

标签 javascript typescript optional-chaining

我到达这里:

buyTicketData?.pricingOptions

这个错误:

[tsl] ERROR in /Applications/MAMP/htdocs/wp-content/plugins/tikex/tikexModule/components/BuyTicket/PricingOptionInvoiceItemsFormFieldsCheckboxes.tsx(280,25)
      TS2532: Object is possibly 'undefined'.

如果 ? 的左侧未定义,为什么 ? 会包裹它,而不是?

以下是类型:

buyTicketData?: BuyTicketData;

export type BuyTicketData = {
  pricingOptions?: PricingOptions;
}

export type PricingOptions = {
  [optionId: string]: PricingOptionType;
};

export type PricingOptionType = {
  invoiceItems?: InvoiceItems;
};

export type InvoiceItems = {
  [invoiceItemId: string]: InvoiceItemData;
};

export type InvoiceItemData = {
  defaultValue?: number;
};

这就是整个表达式

<select
value={
startPaymentIn?.invoiceItems?.[key] != undefined
  ? startPaymentIn?.invoiceItems?.[key] == 1
    ? "Igen"
    : "Nem"
  : startPaymentIn?.pricingOptionId &&
    buyTicketData?.pricingOptions?.[ // <-- here
      startPaymentIn!.pricingOptionId!
    ].invoiceItems[key]?.defaultValue != undefined
  ? startPaymentIn?.pricingOptionId &&
    buyTicketData?.pricingOptions?.[
      startPaymentIn!.pricingOptionId!
    ].invoiceItems[key]?.defaultValue == 1
    ? "Igen"
    : "Nem"
  : undefined
}

好的,找到解决方案:

value={
  startPaymentIn?.invoiceItems?.[key] != undefined
    ? startPaymentIn?.invoiceItems?.[key] == 1
      ? "Igen"
      : "Nem"
    : buyTicketData?.pricingOptions?.[
        startPaymentIn?.pricingOptionId ?? ""
      ]?.invoiceItems?.[key]?.defaultValue != undefined
    ? buyTicketData?.pricingOptions?.[
        startPaymentIn?.pricingOptionId ?? ""
      ]?.invoiceItems?.[key]?.defaultValue == 1
      ? "Igen"
      : "Nem"
    : undefined
}

我只是不知道为什么这个丑陋的? ""条件需要。

最佳答案

如果 aundefined,则 a.b 会抛出异常,而 a?.b 则解析为 undefined 。您仍然需要处理未定义

buyTicketData?.pricingOptions?.[startPaymentIn?.pricingOptionId]

决定

buyTicketData?.pricingOptions?.[undefined]

如果startPaymentIn未定义。这会引发错误,因为 undefined 不能是键。

如果这个变量是必需的,更好的方法是在所有内容之前进行空检查,这样您就根本不需要?.

if(startPaymentIn)
{
    //no need to use ?. on startPayment
}

关于javascript - 为什么我在这个可选链中收到 "Object is possibly ' undefined'"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70647673/

相关文章:

typescript - 是否可以从 TypeScript 的类型推断中排除 "this"?

javascript - Angular 6 - 如何等待通话订阅

javascript - JSHint 抑制可选链接的错误

Swift3 可选链接和解包错误处理

javascript - 使用基本原语创建的家谱具有针对子项的额外链接

javascript - Bootstrap 选择在 jquery pep 中不起作用

javascript - 在 ExtJS 中自动调整文本字段标签

javascript - 在 phonegap 中使用 javascript(sencha touch)时 Android 模拟器中的引用错误

typescript 重载箭头功能不起作用

angular - Angular 模板中的可选链接