Создание статического класса в Typescript

Вы не можете иметь статические классы в Typescript из коробки, но есть несколько подходов к созданию класса, который не может быть инстанцирован. Эта статья посвящена им.

1. Сделать конструктор приватным

class JustAClass {
  private constructor() { }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

При попытке инстанцирования Intellisense выдаст предупреждение.

2. Выбросить ошибку в конструкторе класса

class Static {
  constructor() {
    throw new Error('No, you don't!');
  }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Выброс ошибки внутри конструктора делает свое дело, более того, другие классы теперь могут наследовать этот класс, чтобы самим стать статическими:

class JustAClass extends Static {
  constructor() { super(); }
}
Войти в полноэкранный режим Выход из полноэкранного режима

Правда, в отличие от первого способа, никакой подсказки нет.

3. Использовать абстракцию

abstract class JustAClass {}
Войти в полноэкранный режим Выйти из полноэкранного режима

Intellisense все равно предупредит вас при попытке инстанцирования, хотя это выглядит как неправильное использование ключевого слова abstract.

4. Создайте декоратор, чтобы сделать любой класс статическим

Этот подход сочетает метод 2 с функцией декораторов в typescript. Мы создаем функцию, которая выкачивает анонимный класс, наследующий данный класс, и переопределяет вызов его конструктора с выбросом ошибки. И да, она нарушает все правила и не вызывает super, как плохой мальчик, поэтому мы заставляем компилятор замолчать с помощью @ts-ignore.

function Static<T extends new (...args: any[]) => any>(ctr: T): T {
  return class extends ctr {
    // @ts-ignore
    constructor(...args: any[]) {
      throw new Error('no way dude');
    }
  }
}

@Static
class JustAClass {}
Вход в полноэкранный режим Выход из полноэкранного режима

Хотя этот подход не обеспечивает безопасности intellisense, он достаточно декларативен.

Вот такие четыре способа я обнаружил 🙂

Оцените статью
devanswers.ru
Добавить комментарий