Що робить ключове слово static?
1. Основна ідея
Зазвичай методи і властивості створюються для екземпляра класу (через new):
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 робить властивість доступною лише через сам клас,
а не через об'єкт:
class User {
static role = "user"; // статична властивість
}
console.log(User.role); // доступ через клас
// console.log(u.role); // Помилка - у екземпляра немає властивості role2. Приклад: статичні методи
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 (екземпляра) | Так | Ні (лише до класу) |
Приклад порівняння
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. Статичні властивості та методи можуть бути типізовані
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
Статичні члени можуть бути приватними, тобто доступними лише всередині самого класу:
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; // private6. Доступ до статичних членів усередині класу
Усередині класу звертатися потрібно через ім'я класу, а не через this:
class Example {
static count = 0;
increment() {
// this.count++; // помилка - немає в екземпляра
Example.count++; // коректно
}
}
thisусередині звичайного методу посилається на екземпляр, а статичні поля належать класу.
7. Статичні блоки (ES2022 / TS 4.4+)
TypeScript підтримує static blocks - код, який виконується один раз під час завантаження класу.
class Settings {
static config = {};
static {
console.log("Initializing Settings...");
Settings.config = { mode: "prod" };
}
}
console.log(Settings.config); // { mode: "prod" }Це зручно для ініціалізації статичних даних, які не повинні бути всередині конструктора.
8. Успадкування статичних членів
Статичні властивості та методи успадковуються:
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робить метод або властивість "спільними" для всього класу, а не для конкретного об'єкта.Чудово підходить для утиліт, констант, лічильників, фабрик і ініціалізації.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.