我已经为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`);
}
});
注意:该代码极其简化,仅适用于重要的事情。这不是我真正的应用程序。
答案 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”]。
如果有人知道我为什么收到此错误,并乐于解释,请执行!我花了几个小时试图使存储工作...