Использование необязательной цепочки в машинописи при использовании синтаксиса поиска по ключевой скобке - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь использовать необязательный оператор цепочки для следующего:

productPrice1: product.prices["1"]?.amount.amount_1,

Имеющийся у меня вопросительный знак гарантирует, что если дочерний объект ключа ["1"] не существует это не подведет. Однако я хотел бы сделать то же самое, если объект цен (родительский объект) также не существует.

Цены - это объект с дочерними объектами, которые имеют ключи, такие как «1», «2» «3». Сначала я хочу проверить, равны ли цены нулю, если нет, то проверить, существует ли ["1"].

Моя первоначальная попытка состояла в том, чтобы попробовать это, и это не работает:

productPrice1: product.prices?["1"]?.amount.amount_1,

Я стараюсь избегать следующих действий и задаюсь вопросом, является ли это моим единственным вариантом:

productPrice1: product.prices != null ? product.prices?["1"]?.amount.amount_1 : null,

1 Ответ

1 голос
/ 04 марта 2020

Предполагая, что ваше значение product имеет что-то вроде следующего типа:

declare const product: {
    prices?: Partial<Record<"1" | "2" | "3",
        {
            amount: {
                amount_1: number
            }
        }>>
}

Тогда вы можете использовать необязательное сцепление , например:

const val = {
    productPrice1: product.prices?.["1"]?.amount.amount_1
}

Здесь важно отметить, что синтаксис для необязательного сцепления всегда ?. с точкой, , даже если вы не используете точечный доступ к свойству . Согласно необязательное предложение о сцеплении tc39 (выделение добавлено):

Оператор необязательного сцепления пишется ?.. Он может появляться в трех позициях:

obj?.prop // optional static property access <b>obj?.[expr] // optional dynamic property access</b> func?.(...args) // optional function or method call

Да, это странно, и они это знают. Согласно предложению FAQ :

obj?.[expr] и func?.(arg) выглядят безобразно. Почему бы не использовать obj?[expr] и func?(arg), как это делает ?

Мы не используем синтаксис obj?[expr] и func?(arg) из-за сложности синтаксического анализа, чтобы эффективно отличать guish эти формы от условного оператора, например, obj?[expr].filter(fun):0 и func?(x - 2) + 3 :1.

Альтернативные синтаксисы для этих двух случаев имеют свои недостатки; и решить, какой из них выглядит наименее плохим, - это в основном вопрос личного вкуса. Вот как мы сделали наш выбор:

  • выберите лучший синтаксис для случая obj?.prop, который, как ожидается, будет происходить чаще всего;
  • расширит использование распознаваемого ?. последовательность символов в других случаях: obj?.[expr], func?.(arg).

Что касается имеет другие синтаксические ограничения, чем JavaScript из-за .

Хорошо, но я действительно думаю, что лучше.

Различные альтернативные синтаксисы изучались и широко обсуждались в прошлом. Никто из них не достиг консенсуса. Поиск проблем с меткой «альтернативный синтаксис», а также проблем с меткой «альтернативный синтаксис и семантика» для тех, которые влияли на семантику.

Хорошо, надеюсь, это поможет; удачи!

Детская площадка ссылка на код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...