如何为一个类声明默认函数?

时间:2019-05-14 05:08:09

标签: typescript class default function-call-operator

C++中的Function Call Operator允许类像函数一样工作。我在类似这样的日志记录类中使用了它:

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

变成这样:

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

现在我想在type-script中使用Function Call Operator或朝那个方向使用(为我的班级提供default-function),但是我们如何在{ {1}}?

我们宁愿在GitHub发出功能请求吗?

1 个答案:

答案 0 :(得分:3)

这应该是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