为什么我在此可选链中收到“对象可能是‘未定义’”?

Ján*_*nos 2 javascript typescript optional-chaining

我去那儿:

buyTicketData?.pricingOptions
Run Code Online (Sandbox Code Playgroud)

这个错误:

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

如果左侧?未定义,?则将其包裹起来,为什么这很重要?

以下是类型:

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;
};
Run Code Online (Sandbox Code Playgroud)

无论如何,这就是整个表达式

buyTicketData?.pricingOptions
Run Code Online (Sandbox Code Playgroud)

好的,找到解决方案:

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

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

Ric*_* Mo 5

如果aundefined,则在解析a.b为时抛出异常。您仍然需要处理.a?.bundefinedundefined

buyTicketData?.pricingOptions?.[startPaymentIn?.pricingOptionId]
Run Code Online (Sandbox Code Playgroud)

决心

buyTicketData?.pricingOptions?.[undefined]
Run Code Online (Sandbox Code Playgroud)

如果startPaymentInundefined。这会引发错误,因为undefined不能是密钥。

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

if(startPaymentIn)
{
    //no need to use ?. on startPayment
}
Run Code Online (Sandbox Code Playgroud)