【问题标题】:How to declare default-function for a class?如何为类声明默认函数?
【发布时间】:2019-05-14 05:08:09
【问题描述】:

C++ 中的Function Call Operator 允许类像函数一样工作。我在一个日志类中使用过它:

logger.setFileName("./debug.log");
logger.log("Log this message");

变成这样:

logger.setFileName("./debug.log");
logger("Log this message");

现在我想在类型脚本中使用Function Call Operator 或该方向的东西(为我的类提供默认函数),但是我们如何在类型脚本中实现这样的声明?

我们是否应该在GitHub 提出功能请求?

【问题讨论】:

    标签: typescript class default function-call-operator


    【解决方案1】:

    这需要是JavaScript proposal

    你不能创建一个像这样行为的 JavaScript class,但是你可以创建一个像这样行为的常规函数​​,尽管它需要一些体操:

    interface Logger {
      (message: string): void;
      setFileName(filename: string): void;
    }
    
    const logger = function (message: string) {
    
    } as Logger;
    
    logger.setFileName = function (filename: string) {
    
    }
    
    logger.setFileName("./debug.log");
    logger("Log this message");
    

    编辑:这里是an example,它使用createLogger() 工厂函数来创建多个实例,并将状态存储在函数范围内:

    interface Logger {
      (message: string): void;
      setFileName(filename: string): void;
    }
    
    const createLogger = (): Logger => {
      let _filename: string;
      const logger = function (message: string) {
        console.log(_filename, message);
      } as Logger;
    
      logger.setFileName = function (filename: string) {
        _filename = filename;
      }
    
      return logger;
    }
    
    const logger1 = createLogger();
    const logger2 = createLogger();
    logger1.setFileName("./debug1.log");
    logger2.setFileName("./debug2.log");
    logger1("one");
    logger2("two");
    
    // Output:
    // ./debug1.log one
    // ./debug2.log two
    

    【讨论】:

    • 使用这种方法,我们将如何以及在何处存储filename 变量?
    • 您可以使用IIFE 在模块范围或函数范围中存储。就像我说的...有点体操来实现它。
    • 是否有多个logger 实例,每个实例都有单独的filename 属性? (如果是,你能更新你的答案来证明它)
    • 当然可以,但是你必须使用一些非class 的实例化方法,比如createLogger 工厂函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2016-01-20
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多