Типізація конструктора
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; // Помилка: readonly3. Параметри за замовчуванням і необов'язкові параметри
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); // User5. Тип параметрів конструктора, витягнутий через утиліту 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
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.