Вы не можете иметь статические
классы в 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, он достаточно декларативен.
Вот такие четыре способа я обнаружил 🙂