Skip to main content

Типізація конструктора

1. Базова типізація параметрів конструктора

javascript
class User { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } }

Тут параметри конструктора name і age мають явно вказані типи. TypeScript перевіряє:

  • що при створенні екземпляра new User(...) передаються правильні типи;
  • що поля класу та параметри конструктора сумісні.
javascript
const u1 = new User("Tim", 25); // OK const u2 = new User(25, "Tim"); // Помилка: типи не збігаються

2. Скорочений запис через модифікатори

TypeScript дозволяє автоматично оголосити та проініціалізувати властивості прямо в параметрах конструктора:

javascript
class User { constructor(public name: string, private age: number) {} }

Це еквівалентно:

javascript
class User { public name: string; private age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } }

Модифікатори, які можна використовувати:

  • public - властивість доступна всюди
  • private - доступна лише всередині класу
  • protected - доступна всередині класу та нащадків
  • readonly - лише для читання (не можна змінити після ініціалізації)

Приклад:

javascript
class Point { constructor( public readonly x: number, public readonly y: number ) {} } const p = new Point(5, 10); p.x = 8; // Помилка: readonly

3. Параметри за замовчуванням і необов'язкові параметри

javascript
class User { constructor( public name: string, public age: number = 18, public city?: string ) {} } new User("Tim"); // age = 18, city = undefined new User("Alex", 25, "Paris");

У TypeScript всі стандартні правила параметрів функцій працюють і для конструкторів.


4. Типізація конструктора як функції

Іноді потрібно типізувати сам конструктор - наприклад, при передачі класу як аргументу:

javascript
type Constructor<T> = new (...args: any[]) => T; function createInstance<T>(Ctor: Constructor<T>): T { return new Ctor(); } class User { constructor(public name = "Tim") {} } const u = createInstance(User); // User

5. Тип параметрів конструктора, витягнутий через утиліту ConstructorParameters

TypeScript надає вбудований утилітний тип:

javascript
type ConstructorParameters<T> = T extends new (...args: infer P) => any ? P : never;

Приклад:

javascript
class User { constructor(public name: string, public age: number) {} } type Params = ConstructorParameters<typeof User>; // [string, number] const args: Params = ["Tim", 25]; const u = new User(...args); // OK

Працює через infer - витягує типи параметрів з конструктора.


6. Тип значення, що повертається конструктором (InstanceType)

Якщо потрібно отримати тип екземпляра, використовуй утиліту InstanceType:

javascript
class User { constructor(public name: string, public age: number) {} } type UserInstance = InstanceType<typeof User>; // { name: string; age: number; } const u: UserInstance = new User("Tim", 25);

7. Конструктори з generic-параметрами

javascript
class Box<T> { constructor(public value: T) {} } const strBox = new Box<string>("Hello"); const numBox = new Box(123); // T = number (інференс)

Підсумок

МожливістьПрикладЩо робить
Звичайна типізаціяconstructor(name: string, age: number)Просте оголошення типів
Скорочена формаconstructor(public name: string)Автоматично створює поле
Необов'язкові параметриconstructor(name: string, age?: number)Параметр можна не передавати
Параметри за замовчуваннямconstructor(name: string, age = 18)Значення за замовчуванням
Тип конструктораtype Ctor<T> = new (...args: any[]) => TВизначає "тип класу"
Витягування параметрівConstructorParameters<typeof C>Отримує [тип_1, тип_2, ...]
Тип екземпляраInstanceType<typeof C>Отримує тип екземпляра класу

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

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

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