TypeScript中如何调用回调函数?声明与实现不匹配的调用问题
问题分析与解决方案
首先,核心问题出在函数声明和实际实现的参数类型不匹配:
你声明的_translate函数里,第二个参数callback被定义为接收T类型参数并返回T类型的函数((name: T) => T),但实际实现中却把callback的类型写成了T——这就导致你调用时传入的函数完全不符合实现的参数类型要求,自然没法正常执行。
修复方案(推荐优先调整实现匹配声明)
因为函数声明是对外暴露的接口,应该优先让实现来匹配声明的类型定义:
- 修正
_translate的实现,让callback参数类型和声明一致:
public _translate(value: T, callback: (name: T) => T): void { if (!this.translate) { // 此时callback是函数,可以正常调用并传入value callback(value); } }
- (可选优化)如果你的回调函数不需要返回
T类型(比如你示例里只是打印日志,没有返回值),建议把声明里的回调返回值改成void,这样类型更准确:
// 修改声明 _translate(value: T, callback: (name: T) => void): void; // 对应修改实现 public _translate(value: T, callback: (name: T) => void): void { if (!this.translate) { callback(value); } }
做完以上修改后,你原来的调用代码:
this._translate(value, function(data: T) { console.log(data); });
就可以正常工作了——回调函数会在!this.translate的条件满足时被执行,打印出传入的value。
特殊情况(如果需求是让callback为T类型)
如果你的实际需求是callback参数就是T类型(而非函数),那你需要修改函数声明来匹配实现:
// 修改声明 _translate(value: T, callback: T): void;
但这种情况下,你原来传入函数的调用方式就不符合要求了,需要传入T类型的值,这应该不是你想要的场景,所以优先推荐前面的方案。
内容的提问来源于stack exchange,提问作者dooglu
相关产品推荐
相关产品推荐

