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

如何在TypeScript中为Telegraf处理函数参数实现类型继承?

问题描述

我有一段使用Telegraf的代码:

import { Telegraf } from "telegraf";
const bot = new Telegraf(process.env.BOT_TOKEN || "");

bot.on(message("text"), async (ctx) => {
  console.log(ctx.message?.text);
});

此处的ctx参数拥有冗长且复杂的类型,包含大量可访问属性。现在我想将逻辑改写为使用独立处理函数的形式,但不想直接使用类似AnStrangeType这类怪异的类型:

async function handleMessage(ctx: AnStrangeType): Promise<void> {
  console.log(ctx.message?.text);
}
bot.on(message("text"), handleMessage);

请问是否有办法为处理函数的参数实现类似类型继承的效果?

解决方案

当然可以,以下是几种实用的实现方式:

1. 从Telegraf类型系统中提取对应类型

直接利用Telegraf提供的类型工具,提取出对应消息处理函数的上下文类型,无需手动定义冗长类型:

import { Telegraf, Middleware, Context } from "telegraf";
const bot = new Telegraf(process.env.BOT_TOKEN || "");

// 精准提取text消息对应的上下文类型
type TextMessageContext = Parameters<typeof bot.on<"text">>[1] extends Middleware<infer C> ? C : never;

async function handleMessage(ctx: TextMessageContext): Promise<void> {
  console.log(ctx.message?.text);
}

bot.on(message("text"), handleMessage);

这种方式能让handleMessage的ctx获得完整的类型提示,同时避免手动书写复杂类型。

2. 自定义局部类型+类型兼容

如果只用到ctx的部分属性,可以自定义一个包含所需属性的接口,再通过类型断言让处理函数兼容Telegraf的要求:

import { Telegraf, Middleware, Context } from "telegraf";
const bot = new Telegraf(process.env.BOT_TOKEN || "");

// 仅定义需要用到的属性
interface RequiredContext {
  message?: {
    text?: string;
  };
  // 可添加其他需要的属性
}

async function handleMessage(ctx: RequiredContext): Promise<void> {
  console.log(ctx.message?.text);
}

// 断言类型兼容
bot.on(message("text"), handleMessage as Middleware<Context>);

3. 泛型自动推导

将处理函数定义为泛型函数,让TypeScript自动推导ctx的类型,同时可通过泛型约束确保类型安全:

import { Telegraf } from "telegraf";
const bot = new Telegraf(process.env.BOT_TOKEN || "");

// 通过泛型约束限定必要属性
async function handleMessage<T extends { message?: { text?: string } }>(ctx: T): Promise<void> {
  console.log(ctx.message?.text);
}

bot.on(message("text"), handleMessage);

其中第一种方法是最推荐的,既保留了完整的类型提示,又无需维护复杂的自定义类型。

内容的提问来源于stack exchange,提问作者Majid Sadr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:47:08