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

Conv.user.storage property does not exist on type {} Actions on Google DialogFlow

我已经为 Google 主页集成了一段时间,但由于某些原因我无法让 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`);
  }
 });

注意:代码被极度简化,只包含重要的部分。这不是我的真实应用。

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

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

出于某种原因,TypeScript 不允许我执行此约定,所以我采用了老式的解决方法:

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

这成功了!为了获得我再次调用 user.conv.storage["someProperty"] 的值。

如果有人知道我为什么会收到此错误并且很乐意解释,请告诉我!我花了几个小时试图让存储正常工作...

部分问题是这些示例是为 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>();

might be argued你想要一个 GenericStorage 对象,虽然我对 TypeScript 的经验还不够,不知道这是否真的是一个好的解决方案:

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

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

opened a bug 反对库建议默认执行此类操作。