Свойство Conv.user.storage не существует для действий типа {} в Google DialogFlow - PullRequest
0 голосов
/ 26 ноября 2018

Я некоторое время работал над интеграцией для Google Home, но по какой-то причине не могу заставить работать user.conv.storage.someProperty = "кое-что"; `.

Ошибка, которую я получаю: Свойство '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 голосов
/ 27 ноября 2018

Часть проблемы заключается в том, что примеры написаны для JavaScript, а не для TypeScript, и строгая проверка типов в TS вызывает проблему.

Как вы обнаружили, обращение к нему с помощью индекса, а не с помощьюсобственность дает вам то, что вам нужно.Это допустимый обходной путь, хотя и немного хакерский.

Однако основная проблема заключается в том, что при экспорте DialogflowConversation тип TUserStorage определяется как объект без особых свойств.Из источника (по крайней мере, на момент написания этой статьи):

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

при создании объекта app вы можете определить здесь свои собственные типы, если у вас есть определенные свойстваВы хотите проверить.Из выпуска 188 (который иллюстрирует это с типом TConvData) вы можете сделать что-то вроде:

interface LoginStorage {
  authToken?: string
}

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

Это может быть доказано , что вы хотите GenericStorageВозьмите такой объект, хотя я не достаточно опытен с TypeScript, чтобы понять, действительно ли это хорошее решение:

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

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

Я открыл ошибку в библиотеке, предполагая, чточто-то в этом роде должно быть сделано по умолчанию.

0 голосов
/ 27 ноября 2018

Я только что нашел ответ!Как я уже сказал в своем вопросе, ошибка была в

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

По какой-то причине TypeScript не позволил мне сделать это соглашение, поэтому я пошел по старинке:

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

И это сработало!Чтобы получить значение, я снова вызвал user.conv.storage ["someProperty"].

Если кто-то знает, почему я получил эту ошибку, и был бы рад ее объяснить, пожалуйста, сделайте!Я провожу несколько часов, пытаясь заставить хранилище работать ...

...