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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:01:33