Предполагая, что ваше значение 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 из-за .
Хорошо, но я действительно думаю, что лучше.
Различные альтернативные синтаксисы изучались и широко обсуждались в прошлом. Никто из них не достиг консенсуса. Поиск проблем с меткой «альтернативный синтаксис», а также проблем с меткой «альтернативный синтаксис и семантика» для тех, которые влияли на семантику.
Хорошо, надеюсь, это поможет; удачи!
Детская площадка ссылка на код