Функция создания приложения dialogflow
перегружена параметрами универсального типа, позволяющими переопределить тип беседы, отправляемый через обработчик намерений.
Вам просто нужно создать расширение типасоответствующий тип разговора.Это намного сложнее для обеспечения безопасности всех типов, но это выполнимо.
Таким образом, фрагмент, которым вы поделились в TypeScript в наиболее безопасной и обобщенной реализации типа, будет:
import {
dialogflow,
DialogflowConversation,
DialogflowMiddleware,
Contexts,
} from 'actions-on-google';
// an interface with the extensions to the Conversation type
interface HelperConversation<
TData = {},
TUserStorage = {},
TContexts extends Contexts = {},
> extends DialogflowConversation<TData, TUserStorage, TContexts> {
helper: Helper<TData, TUserStorage, TContexts>;
}
// the helper class now passing generic type parameters from the Conversation type
class Helper<TData, TUserStorage, TContexts extends Contexts> {
constructor(public conv: DialogflowConversation<TData, TUserStorage, TContexts>) {}
func1() {
this.conv.ask(`What's up?`);
}
}
// to keep type security in the middleware, it needs to be functional and of the DialogflowMiddleware type
const middleware: DialogflowMiddleware<HelperConversation> =
conv => Object.assign(conv, { helper: new Helper(conv) })
// pass the extended Conversation interface into the `dialogflow` function
const app = dialogflow<HelperConversation>()
.middleware(middleware);
app.intent('Default Welcome Intent', conv => {
// now conv is of the type `HelperConversation`
conv.helper.func1();
});
В зависимости от того, насколько безопасным / универсальным вы хотите быть промежуточное программное обеспечение TypeScript, вы можете избавиться от множества дополнительных универсальных параметров с помощью базовых типов объектов, что сокращает объем кода.
Вы также можете взятьвзгляните на фрагменты кода TypeScript, используемые во время альфа-версии, для более подробного использования TypeScript с библиотекой: