You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:04:58