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

如何在多个回调函数中正确定义TypeScript类型

解决TypeScript回调类型不明确的问题

你可以通过给类型添加泛型参数或者让函数成为泛型函数的方式,彻底替代data: any的不安全写法,同时完美匹配每个回调的明确类型:

方案一:给Test类型添加泛型参数

这种方式适合保留多个独立fn函数的场景,通过泛型绑定每个fn对应的回调参数类型:

type Test<T> = {
    callback: (data: T) => void;
}

function callback1(data: string): void {
    console.log('callback 1');
}

function callback2(data: number): void {
    console.log('callback 2');
}

function fn1({ callback }: Test<string>) {
    callback('val1');
}

function fn2({ callback }: Test<number>) {
    callback(1);
}

fn1({ callback: callback1 });
fn2({ callback: callback2 });

每个fn函数通过指定Test<T>的具体类型,强制要求传入的callback必须接受对应类型的参数,既避免了any,也能精准匹配各个回调的类型定义,新增fn时只需要指定对应的泛型即可。

方案二:复用泛型函数

如果你的fn逻辑类似,只是传入的数据和回调不同,可以把fn改成泛型函数,让TypeScript自动推导类型:

function callback1(data: string): void {
    console.log('callback 1');
}

function callback2(data: number): void {
    console.log('callback 2');
}

function fn<T>({ callback }: { callback: (data: T) => void }, data: T) {
    callback(data);
}

fn({ callback: callback1 }, 'val1');
fn({ callback: callback2 }, 1);

调用时TypeScript会根据传入的回调和数据自动推导泛型T的类型,确保回调参数和传入数据的类型完全一致,无需手动定义多个fn函数,更简洁灵活。

为什么之前的泛型写法无效

你之前尝试的callback: <T>(data:T) => void是让回调自身成为泛型函数,意味着回调可以接受任意类型的参数,这和你希望“回调已有明确类型”的需求不符。正确的做法是将泛型绑定在外部类型或函数层面,固定回调的参数类型,而非让回调本身支持任意类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:14:59