Javascript Дополнительная цепочка не работает с шаблонными литералами - PullRequest
2 голосов
/ 05 августа 2020

Я пытаюсь применить литерал шаблона с необязательной цепочкой.

type Item = {
itemId:number,
price: number};

type ItemType = {
A:Item,
B:Item
};

const data : ItemType = {
  A:{itemId:1, price:2},
  B:{itemId:2, price:3}
};

let Itemid = `data?.${variable}?.itemId`


где переменная - это строка со значением A или B. Я не уверен, поддерживаются ли необязательные цепочки и литералы шаблонов вместе. Приветствуются любые заявки.

Отредактировано: я получаю «строка не может использоваться для индексации типа Item» при попытке с помощью data?.[variable]?.itemId. Я обновил тип сейчас.

Отредактировано: Удаление типа переменной помогло в решении вышеуказанного сообщения об ошибке.

Ответы [ 2 ]

5 голосов
/ 05 августа 2020

Строковый литерал выводит строку, поэтому вы можете использовать eval(`data?.${variable}?.itemId`) для оценки его значения. (Обратите внимание, что использование eval - плохая практика.)

Однако в вашем случае нет необходимости использовать литералы шаблонов.

Просто оберните переменную внутри [ и ] например: data?.[variable]?.itemId (он называется Computed Property Names и это функция es6.)

Полный код:

let data = {
  A:{itemId:1, price:2},
  B:{itemId:2, price:3}
}

let variable = 'A'
let Itemid = data?.[variable]?.itemId
4 голосов
/ 05 августа 2020

В шаблоне единственный материал, который обрабатывается как выражение, - это материал внутри ${}, поэтому в вашем случае ваши необязательные индикаторы цепочки являются частью строки , а не частью выражения, которое будет интерполируется в строку.

Синтаксис для необязательного связывания с использованием ключей объектов: data?.['string']?.itemId, или если ключ хранится внутри переменной data?.[variable]?.itemId.

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