Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить ConstructorParameters<T>?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`ConstructorParameters<T>`** - це вбудований utility-тип TypeScript, який **видобуває типи параметрів конструктора** з переданого класу або конструктора, так само як `Parameters<T>`, тільки **для класів** (або конструктор-функцій). **Ключове:** результат - це **tuple** (кортеж) із типів параметрів конструктора.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що робить `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`). | | Що буде з не-конструктором? | Помилка типів. | | Що повертає? | Кортеж типів аргументів конструктора. |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.