类型{}上的Conv.user.storage属性不存在Google DialogFlow上的操作

时间:2018-11-26 15:55:45

标签: dialogflow actions-on-google

我已经为Google Home集成了一段时间,但是由于某种原因,我无法使user.conv.storage.someProperty =“ something”;`正常工作。

我得到的错误是:类型'{}'上不存在属性'authtoken'。

但是...这正好是他们的示例,您可以通过在线查看文档或使用其自身导入包的代码来获得

这是他们的代码,我认为可以。

// Dialogflow
app.intent('Default Welcome Intent', conv => {
  conv.user.storage.someProperty = 'someValue'
})`

这是我出于意图的全部代码:

app.intent("Default Welcome Intent", async (conv) => {
  const login = await login();
    if (login) {
     conv.user.storage.authToken = login.authToken;
     conv.ask(`hi ${conv.user.storage.authToken}`);
    } else {
     conv.close(`something went wrong`);
  }
 });

注意:该代码极其简化,仅适用于重要的事情。这不是我真正的应用程序。

2 个答案:

答案 0 :(得分:3)

部分问题是示例是为JavaScript而不是TypeScript编写的,并且TS中严格的类型检查导致了问题。

正如您所发现的,通过索引而不是通过属性来引用它可以满足您的需求。这是一个有效的解决方法,尽管有点麻烦。

但是,潜在的问题是,当它们导出DialogflowConversation时,TUserStorage类型被定义为没有特定属性的对象。从the source起(至少在撰写本文时):

export class DialogflowConversation<
  TConvData = {},
  TUserStorage = {},
  TContexts extends Contexts = Contexts,
> extends Conversation<TUserStorage>

创建app对象时,如果您要检查特定的属性,则可以在此处定义自己的类型。在issue 188(以TConvData类型进行说明)中,您可以执行以下操作:

interface LoginStorage {
  authToken?: string
}

const app = dialogflow<{}, LoginStorage>();

尽管我对TypeScript的经验还不足以知道这是否是一个很好的解决方案,但might be argued仍希望这些方面的GenericStorage对象:

interface GenericStorage {
    [propName: string]: any;
}

const app = dialogflow<GenericStorage, GenericStorage>();

我已经opened a bug针对该库,建议默认情况下执行此类操作。

答案 1 :(得分:1)

我刚刚找到了答案!就像我在问题中说的那样,错误在于

user.conv.storage.someProperty = "something";

由于某种原因,TypeScript不允许我执行此约定,所以我选择了老式的方法:

user.conv.storage["someProperty"] = "something";

这有效!为了获得该值,我再次调用了user.conv.storage [“ someProperty”]。

如果有人知道我为什么收到此错误,并乐于解释,请执行!我花了几个小时试图使存储工作...