Статические классы в TypeScript: объявление и использование

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

typescript
Скопировать код
class Utils {
    static constant: number = 42;
    
    static compute(): number {
        return Utils.constant * 2;
    }
}

// При использовании
console.log(Utils.constant); // Выводит: 42
console.log(Utils.compute()); // Выводит: 84

Все составляющие класса снабжены ключевым словом static, что делает их доступными без создания экземпляра класса.

Кинга Идем в IT: пошаговый план для смены профессии

Введение в статические члены

Статические члены в TypeScript — это методы и свойства, принадлежащие самому классу, а не его экземплярам. Такой подход знаком по другим языкам программирования, таким как C#. Следовательно, класс, только из статических членов, не создаётся с помощью оператора new.

Абстрактные классы в TypeScript

Абстрактные классы в TypeScript действуют как шаблоны, содержащие статические свойства и методы. Прямое создание экземпляров таких классов невозможно.

typescript
Скопировать код
abstract class Singleton {
    static instance: Singleton;

    private constructor() {
        // Этот класс слишком специфичен для инстанцирования 😉
    }
    
    static getInstance(): Singleton {
        if (!Singleton.instance) {
            Singleton.instance = new Singleton();
            // Здесь может пригодиться логика инициализации
        }
        return Singleton.instance;
    }
}

Такая реализация запрещает прямую инстанциацию класса и следует паттерну "Singleton", используя ленивую инициализацию instance.

Неизменяемые статические свойства

Используйте readonly для определения констант.

typescript
Скопировать код
class Configuration {
    static readonly VERSION: string = '1.0.0';
}
console.log(Configuration.VERSION); // Выводит: '1.0.0'

Скрытые статические данные

Применяйте приватные статические переменные для инкапсуляции внутренней логики класса.

typescript
Скопировать код
class InternalCounter {
    private static count: number = 0;
    
    static increment(): number {
        return ++InternalCounter.count; // Это наш секрет 🤫
    }
}

Предотвращение создания экземпляров

Закрытый конструктор полностью запрещает создание экземпляров класса.

typescript
Скопировать код
class NonInstantiable {
    private constructor() {
        throw new Error("Не намерен создаваться!"); // Вот это решимость!
    }
}
// new NonInstantiable(); // Это вызовет ошибку.

Основы модулей в TypeScript

Структурирование кода

Структурируйте свой код с помощью модулей TypeScript, группируя связанные функции и свойства. Это похоже на статические классы, но основано на принципах функционального программирования.

typescript
Скопировать код
// MathUtils.ts
export function square(number: number): number {
    return number * number;
}

// В другом файле
import { square } from './MathUtils';
console.log(square(5)); // Выводит: 25

Искусство инкапсуляции

Переменные в модулях TypeScript не видны в глобальной области видимости, что гарантирует их закрытость.

Приватное не означает недоступное

Определите функции, экспортируемые из модуля, чтобы сохранить их состояние неразглашённым, точно так же, как если бы они были приватными статическими членами класса.

typescript
Скопировать код
// Counter.ts
let count = 0;

export function incrementCount() {
    return ++count; // Счет идет точно и уверенно.
}

Визуализация

Статические классы в TypeScript можно представить как ячейки для багажа на железнодорожной станции:

Markdown
Скопировать код
Вокзал 🚉: "Добро пожаловать в TypeScript City!"

Статическая ячейка:

Markdown
Скопировать код
Ячейка (🔒): [Статический метод А, Статический метод Б, Статическое свойство Икс]
Доступ к ячейке: `ClassName.MethodA()` или `ClassName.PropertyX`

Индивидуальная аренда ячейки для каждого экземпляра не требуется:

Markdown
Скопировать код
Раньше: 🔑+🎒 ➡️ 🚪🔓 ➡️ 🛅 (ячейка для каждой вещи)
Теперь со статикой: 🎒 ➡️ 🔒 (одна ячейка на все)

Порядок и быстрый доступ к вашим инструментам (методы/свойства) обеспечены.

Готовы, внимание, инициируем статические конструкторы!

Статическая инициализация

TypeScript не предусматривает статических конструкторов, но можно достичь аналогичного эффекта с помощью немедленно вызываемого функционального выражения (IIFE):

typescript
Скопировать код
class Database {
    static readonly connection;

    static {
        Database.connection = (function () {
            // Здесь размещаются детали подключения
            return new Connection(); // "А кто у нас новенький?" 😎
        })();
    }
}

Вспомогательные функции и различные паттерны

Для большей гибкости и упорядоченности кода, не ограничивайтесь только классами – используйте вспомогательные функции.

Поиск последовательной информации

Для получения самых точных и актуальных сведений о статических и абстрактных чертах TypeScript обращайтесь к респектабельной источникам, таким как Спецификация языка TypeScript.

Полезные материалы

  1. TypeScript: Документация – Классы — официальный учебник TypeScript по классам.
  2. static – JavaScript | MDN — детальное объяснение статических методов в JavaScript, также применимое к TypeScript.
  3. TypeScript Статические Свойства и Методы – Видеоурок — доступное видео о статических концепциях в TypeScript.