Skip to main content

Що робить ключове слово static?

1. Основна ідея

Зазвичай методи і властивості створюються для екземпляра класу (через new):

javascript
class User { name: string; constructor(name: string) { this.name = name; } greet() { console.log(`Hello, ${this.name}!`); } } const u = new User("Tim"); u.greet(); // Hello, Tim!

А от static робить властивість доступною лише через сам клас, а не через об'єкт:

javascript
class User { static role = "user"; // статична властивість } console.log(User.role); // доступ через клас // console.log(u.role); // Помилка - у екземпляра немає властивості role

2. Приклад: статичні методи

javascript
class MathUtils { static sum(a: number, b: number): number { return a + b; } static multiply(a: number, b: number): number { return a * b; } } console.log(MathUtils.sum(3, 4)); // 7 console.log(MathUtils.multiply(3, 4)); // 12

Такі методи можна викликати без створення екземпляра - це "глобальні функції", згруповані в клас.


3. Відмінність від звичайних методів

ХарактеристикаЗвичайний методstatic метод
Належитьекземпляру (new MyClass())самому класу (MyClass)
Доступ з екземпляраТакНі
Доступ через класНіТак
Має доступ до this (екземпляра)ТакНі (лише до класу)

Приклад порівняння

javascript
class Counter { static count = 0; // спільне для всіх instanceCount = 0; // індивідуальне constructor() { Counter.count++; this.instanceCount++; } static reset() { Counter.count = 0; } } const c1 = new Counter(); const c2 = new Counter(); console.log(Counter.count); // 2 (спільне) console.log(c1.instanceCount); // 1 console.log(c2.instanceCount); // 1 Counter.reset(); console.log(Counter.count); // 0

Counter.count - спільне поле для всіх екземплярів, а this.instanceCount - унікальне для кожного об'єкта.


4. Статичні властивості та методи можуть бути типізовані

javascript
class Config { static readonly API_URL: string = "https://api.example.com"; static version: number = 1.0; static getInfo(): string { return `Version: ${Config.version}`; } } console.log(Config.API_URL); console.log(Config.getInfo());

Можна використовувати модифікатори (public, private, readonly) разом зі static.


5. static + private

Статичні члени можуть бути приватними, тобто доступними лише всередині самого класу:

javascript
class Database { private static connection: string; static connect(url: string) { Database.connection = url; console.log(`Connected to ${url}`); } static getConnection() { return Database.connection; } } Database.connect("mongodb://localhost"); console.log(Database.getConnection()); // доступ через публічний static // Database.connection; // private

6. Доступ до статичних членів усередині класу

Усередині класу звертатися потрібно через ім'я класу, а не через this:

javascript
class Example { static count = 0; increment() { // this.count++; // помилка - немає в екземпляра Example.count++; // коректно } }

this усередині звичайного методу посилається на екземпляр, а статичні поля належать класу.


7. Статичні блоки (ES2022 / TS 4.4+)

TypeScript підтримує static blocks - код, який виконується один раз під час завантаження класу.

javascript
class Settings { static config = {}; static { console.log("Initializing Settings..."); Settings.config = { mode: "prod" }; } } console.log(Settings.config); // { mode: "prod" }

Це зручно для ініціалізації статичних даних, які не повинні бути всередині конструктора.


8. Успадкування статичних членів

Статичні властивості та методи успадковуються:

javascript
class Base { static type = "base"; static describe() { console.log(`Type: ${this.type}`); } } class Child extends Base { static type = "child"; } Base.describe(); // Type: base Child.describe(); // Type: child

this у статичному методі вказує на сам клас, а не на батька.


Підсумок

МожливістьОпис
staticРобить властивість/метод такими, що належать класу, а не екземпляру
Де використовуєтьсяУсередині класів
ДоступЧерез ім'я класу (MyClass.member)
УспадковуєтьсяТак
Може бути private / protected / readonlyТак
Доступ до них з екземпляраНі
Підтримує блоки static {} та ініціалізаціюТак (TS 4.4+)

Простіше кажучи:

static робить метод або властивість "спільними" для всього класу, а не для конкретного об'єкта.

Чудово підходить для утиліт, констант, лічильників, фабрик і ініціалізації.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.