Как объявить default-функцию для класса? - PullRequest
0 голосов
/ 14 мая 2019

Оператор вызова функции в C ++ позволяет классу действовать как функция.Я использовал это в классе журналирования, где что-то вроде этого:

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

превращается в это:

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

И теперь я хотел бы использовать Оператор вызова функции или что-то в этом направлении в type-script (чтобы обеспечить функцию по умолчанию для моего класса), но как нам добиться такого объявления в type-script?

Стоит ли нам делать запрос функции в GitHub

1 Ответ

3 голосов
/ 14 мая 2019

Это должно быть предложение JavaScript .

Вы не можете создать 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");

Редактировать : вот пример , который использует фабричную функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...