Имена переменных с переносами в фигурных скобках - PullRequest
2 голосов
/ 05 июня 2019

Я прохожу учебник по NodeJS для Google Assistant / Actions в Google https://codelabs.developers.google.com/codelabs/actions-1/#5 и получаю код, который выглядит следующим образом:

app.intent('Location', (conv, {geo-city}) => {
  const luckyNumber = geo-city.length;
  // Respond with the user's lucky number and end the conversation.
  conv.close('Your lucky number is ' + luckyNumber);
});

Ни линтер в Dialogflow, ни в моей IDE не доволен {geo-city}, но я не могу найти способ обойти это. Я пробовал цитаты, кавычки и т. Д., Но не радость. Я не могу изменить имя переменной, поскольку это системная сущность Google AI (https://cloud.google.com/dialogflow-enterprise/docs/reference/system-entities).

Как правильно это сделать, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Вы можете изменить имя в списке параметров Dialogflow.Несмотря на то, что он использует значение по умолчанию, основанное на типе сущности, вы можете изменить его на любое другое.

Например, учитывая эту обучающую фразу, где она взяла название города в обучающей фразе, ему присвоилитип @sys.geo-city и присвоил ему имя по умолчанию geo-city

enter image description here

, вы можете нажать на имя параметра, отредактировать его и изменитьэто в `city.

enter image description here

Ваш код просто использует city в качестве имени параметра.

app.intent('Location', (conv, {city}) => {
  const luckyNumber = city.length;
  // Respond with the user's lucky number and end the conversation.
  conv.close('Your lucky number is ' + luckyNumber);
});

Если вы действительно хотите оставить его с именем «гео-город», вы все равно можете просто использовать его в качестве имени параметра.Этот второй параметр функции - это просто объект, указанный в именах параметров Dialogflow, и они используют синтаксический сахар JavaScript для его деконструкции.Но ты не обязан.Вы можете использовать код что-то вроде

app.intent('Location', (conv, params) => {
  const luckyNumber = params['geo-city'].length;
  // Respond with the user's lucky number and end the conversation.
  conv.close('Your lucky number is ' + luckyNumber);
});
2 голосов
/ 05 июня 2019

Это объект, разрушающий синтаксис. Когда вы делаете, например ::100100

const func = ({ foo }) => console.log('foo is', foo);

... вы говорите JavaScript: func будет принимать объект в качестве аргумента, но меня интересует только свойство этого объекта с именем foo, поэтому, пожалуйста, укажите значение foo свойство в переменной с именем foo и игнорируем остальное.

Однако, хотя geo-city является допустимым именем свойства в JavaScript, оно не является допустимым именем переменной (в противном случае невозможно было бы определить, является ли это переменная или вы пытаетесь вычесть city из geo). Один из способов решить эту проблему - просто взять объект в качестве аргумента:

const func = (obj) => console.log('foo is', obj.foo);

... или, применительно к вашему коду:

app.intent('Location', (conv, obj) => {
  const luckyNumber = obj['geo-city'].length;
  // ...
});

Но деструктуризация - это хорошо, и у нас есть другой способ заставить ее работать. При деструкции объекта вы можете указать другое имя для переменной (ей):

const func = ({ foo: valueOfFoo }) => console.log('foo is', valueOfFoo);

Это работает даже с таким свойством, как geo-city, но вы должны поместить его в кавычки, например:

app.intent('Location', (conv, {'geo-city': geoCity}) => {
  const luckyNumber = geoCity.length;
  // ...
});
...