Що робить ConstructorParameters<T>?
Що робить ConstructorParameters<T>
ConstructorParameters<T> - це вбудований utility-тип TypeScript, який видобуває типи параметрів конструктора з переданого класу або конструктора.
Він працює так само, як Parameters<T>, тільки для класів (або конструктор-функцій).
Визначення
У сирцях TypeScript:
javascript
type ConstructorParameters<T extends abstract new (...args: any) => any> =
T extends abstract new (...args: infer P) => any ? P : never;Розшифровка:
T- це тип конструктора, тобто щось на кшталтnew (...args) => Instance.infer Pвидобуває типи аргументів конструктора.- Результат - tuple (кортеж) із типів параметрів конструктора.
Приклади коду
1. Звичайний клас
javascript
class User {
constructor(public name: string, public age: number) {}
}
type UserParams = ConstructorParameters<typeof User>;
// [string, number]
const args: UserParams = ["Alex", 30];
const user = new User(...args); // коректно2. Клас без конструктора
javascript
class Empty {}
type P = ConstructorParameters<typeof Empty>;
// []3. Абстрактний клас
javascript
abstract class Base {
constructor(protected id: number, public name: string) {}
}
type BaseParams = ConstructorParameters<typeof Base>;
// [number, string]4. Конструктор як тип
javascript
type Ctor = new (flag: boolean, count: number) => object;
type Args = ConstructorParameters<Ctor>;
// [boolean, number]Що буде, якщо передати не-конструктор
Якщо передати щось, що не є конструктором (наприклад, звичайну функцію або тип без new),
TypeScript видасть помилку:
Type 'T' does not satisfy the constraint 'abstract new (...args: any) => any'
Приклад:
javascript
type Bad = ConstructorParameters<() => void>;
// Помилка: функція не є конструкторомПрактичне застосування
1. Динамічне створення екземплярів
javascript
function createInstance<T extends new (...args: any[]) => any>(
ctor: T,
...args: ConstructorParameters<T>
): InstanceType<T> {
return new ctor(...args);
}
class Person {
constructor(public name: string, public age: number) {}
}
const p = createInstance(Person, "Tom", 25); // типізовано коректно2. Використання в DI / фабриках
javascript
function makeSingleton<T extends new (...args: any[]) => any>(Ctor: T) {
let instance: InstanceType<T> | null = null;
return (...args: ConstructorParameters<T>): InstanceType<T> => {
if (!instance) instance = new Ctor(...args);
return instance;
};
}
class Config {
constructor(public host: string, public port: number) {}
}
const getConfig = makeSingleton(Config);
const c1 = getConfig("localhost", 8080);
const c2 = getConfig("localhost", 8080); // той самий екземпляр3. Спільне використання з InstanceType<T>
ConstructorParameters<T>-> аргументи конструктораInstanceType<T>-> тип екземпляра, що створюється
javascript
class Point {
constructor(public x: number, public y: number) {}
}
type Args = ConstructorParameters<typeof Point>; // [number, number]
type Instance = InstanceType<typeof Point>; // PointПідсумок
| Питання | Відповідь |
|---|---|
Що робить ConstructorParameters<T>? | Видобуває типи параметрів конструктора класу T як tuple. |
| Що можна передавати? | Лише конструктори (класи або типи вигляду new (...args) => any). |
| Що буде з не-конструктором? | Помилка типів. |
| Що повертає? | Кортеж типів аргументів конструктора. |
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.