如何为 class 声明默认函数?

How to declare default-function for a class?

C++ 中的 Function Call Operator 允许 class 像函数一样工作。我在日志记录 class 中使用了它,其中的内容如下:

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

变成这样:

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

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

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

这需要是 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");

Edit:这里是 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