TypeScript中如何实现含无名函数的@azure/functions.Logger接口类?
实现@azure/functions.Logger接口的可调用签名问题
你遇到的错误是因为Logger接口不仅包含error/warn等命名方法,还定义了可调用签名((...args: any[]): void)——这意味着实现该接口的对象必须能像函数一样直接被调用(比如logger('日志内容')),而你的SuperLogger类只实现了命名方法,没处理可调用的部分。
类实现方案
要让类的实例同时具备可调用能力和命名方法,可以通过在构造函数中返回一个绑定了实例方法的函数来实现:
class SuperLogger implements Logger { constructor() { // 实现默认调用的逻辑 const loggerFn = (...args: any[]) => { console.log('默认日志:', ...args); }; // 将类的方法绑定到函数对象上 loggerFn.error = this.error.bind(this); loggerFn.warn = this.warn.bind(this); loggerFn.info = this.info.bind(this); loggerFn.verbose = this.verbose.bind(this); // 返回这个函数,让实例成为可调用对象 return loggerFn as unknown as SuperLogger; } error(...args: any[]): void { console.log('错误日志:', ...args); } warn(...args: any[]): void { console.log('警告日志:', ...args); } info(...args: any[]): void { console.log('信息日志:', ...args); } verbose(...args: any[]): void { console.log('详细日志:', ...args); } }
简化的函数式实现(更适合单元测试)
如果只是单元测试中模拟Logger,用函数对象实现会更简洁,不需要类:
// 创建一个可调用的函数对象,同时添加所需方法 const mockLogger: Logger = ((...args: any[]) => { console.log('默认日志:', ...args); }) as Logger; mockLogger.error = (...args: any[]) => console.log('错误日志:', ...args); mockLogger.warn = (...args: any[]) => console.log('警告日志:', ...args); mockLogger.info = (...args: any[]) => console.log('信息日志:', ...args); mockLogger.verbose = (...args: any[]) => console.log('详细日志:', ...args);
验证使用
无论哪种方式,都可以同时支持两种调用方式:
const logger = new SuperLogger(); // 调用默认日志 logger('这是一条默认日志'); // 调用命名方法 logger.error('这是一条错误日志');
内容的提问来源于stack exchange,提问作者Seth Kitchen
相关产品推荐
相关产品推荐

