Skip to main content

Що робить 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

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