Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Типізація конструктора». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Параметри конструктора типізуються так само, як параметри звичайної функції, наприклад `constructor(name: string, age: number)`. **Ключове:** TypeScript дозволяє скорочену форму через модифікатори (`public`, `private`, `protected`, `readonly`) прямо в параметрах конструктора, яка автоматично оголошує і присвоює поля класу.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 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>` | Отримує тип екземпляра класу |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.