弯括号中带连字符的变量名

时间:2019-06-05 20:17:12

标签: javascript node.js dialogflow actions-on-google

我正在阅读有关Google Assistant的NodeJS教程/ 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中的linter都不满意{geo-city},但是我找不到解决它的方法。我试过引号,反引号等,但没有任何乐趣。我无法更改变量名称,因为它是Google AI系统实体(https://cloud.google.com/dialogflow-enterprise/docs/reference/system-entities)。

请问正确的处理方法是什么?

2 个答案:

答案 0 :(得分:2)

这是对象破坏语法。当您这样做时:

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

...您正在告诉JavaScript:func将以一个对象作为参数,但是我只对名为foo的对象的属性感兴趣,因此请输入变量foofoo属性的值,忽略其余部分。

但是,尽管geo-city在JavaScript中是有效的属性名称,但它不是有效的变量名称(否则,将无法判断它是否是变量,或者是否要减去{{1 }}来自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

答案 1 :(得分:2)

您可以在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);
});

如果您确实希望将其命名为“ geo-city”,则仍可以仅将其用作参数名称。该函数的第二个参数只是一个在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);
});