Telegraf+TypeScript自定义场景上下文:如何避免使用any类型
解决方案
要在Telegraf中正确定义自定义场景上下文并避免any类型,需要完整扩展上下文类型链,具体步骤如下:
1. 定义完整的自定义上下文类型
将基础Bot上下文与自定义场景会话数据整合到一个统一的接口中:
import { Context, Scenes } from 'telegraf'; // 自定义场景会话数据 interface CustomSceneSessionData extends Scenes.SceneSessionData { time: number; offset: number; chatId: number; latitude: number; longitude: number; timeInput: string; } // 整合场景会话到基础上下文,确保类型链一致 interface MyContext extends Context { scene: Scenes.SceneContextScene<MyContext, CustomSceneSessionData>; }
2. 创建Scene和Stage时使用统一的自定义上下文
现在可以在BaseScene和Stage中统一使用MyContext类型,解决类型不兼容问题:
// 创建自定义场景 const myScene = new Scenes.BaseScene<MyContext>('my-scene-id'); // 初始化Stage const stage = new Scenes.Stage<MyContext>([myScene]); // 初始化Bot并挂载Stage中间件 const bot = new Telegraf<MyContext>('YOUR_BOT_TOKEN'); bot.use(stage.middleware());
3. 类型安全地访问自定义会话数据
在场景的回调函数中,可直接通过ctx.scene.session访问自定义字段,TypeScript会自动提供类型提示:
myScene.enter((ctx) => { // 类型安全的操作自定义会话字段 ctx.scene.session.time = Date.now(); ctx.scene.session.chatId = ctx.chat.id; ctx.reply('已进入场景,会话数据初始化完成'); });
关键原因说明
之前的类型不兼容问题,是因为Stage使用了原始的SceneContext类型,而场景使用的是带有自定义会话的SceneContext变体,两者类型不匹配。通过定义统一的MyContext接口,让所有组件共享同一类型体系,即可彻底避免使用any。
内容的提问来源于stack exchange,提问作者Andrii Myronenko
相关产品推荐
相关产品推荐

