Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить InstanceType<T>?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`InstanceType<T>`** - це вбудований utility-тип TypeScript, який **повертає тип екземпляра**, що створюється конструктором `T`. **Ключове:** він видобуває тип об'єкта, який створюється через `new T()`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що робить `InstanceType<T>` `InstanceType<T>` - це вбудований utility-тип TypeScript, який **повертає тип екземпляра**, що створюється конструктором `T`. Іншими словами, він **видобуває тип об'єкта, який створюється через** `new T()`. --- ### Визначення У стандартній бібліотеці TypeScript він описаний так: ```javascript type InstanceType<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : any; ``` Розбір: - `T` - це **тип конструктора** (наприклад, `typeof MyClass`); - `infer R` видобуває тип результату (`new T(...) -> R`); - Повертається саме тип **екземпляра** (`R`). --- ## Приклади InstanceType ### 1. Базовий приклад з класом ```javascript class User { name = "Alex"; age = 25; } type UserInstance = InstanceType<typeof User>; // User const u: UserInstance = new User(); u.name; // string ``` --- ### 2. З класом з конструктором ```javascript class Point { constructor(public x: number, public y: number) {} } type P = InstanceType<typeof Point>; // Point const p: P = new Point(10, 20); ``` --- ### 3. З типом конструктора напряму ```javascript type Ctor = new (id: number) => { id: number }; type Instance = InstanceType<Ctor>; // { id: number } ``` --- ### 4. З абстрактним класом ```javascript abstract class Base { abstract name: string; } type BaseInstance = InstanceType<typeof Base>; // Base ``` --- ### 5. Із вбудованими конструкторами ```javascript type A = InstanceType<typeof String>; // string type B = InstanceType<typeof Number>; // number type C = InstanceType<typeof Date>; // Date ``` --- ## Що буде, якщо передати не-конструктор Якщо передати тип, який **не є конструктором**, TypeScript видасть помилку: ```javascript type Err = InstanceType<string>; // Type 'string' does not satisfy the constraint 'abstract new (...args: any) => any'. ``` --- ## Практичні застосування ### 1. Універсальна фабрика ```javascript function create<T extends new (...args: any[]) => any>( ctor: T, ...args: ConstructorParameters<T> ): InstanceType<T> { return new ctor(...args); } class Product { constructor(public name: string, public price: number) {} } const item = create(Product, "Shirt", 120); // item: Product ``` --- ### 2. Контейнер Dependency Injection ```javascript function use<T extends abstract new (...args: any[]) => any>( ClassRef: T ): InstanceType<T> { return new ClassRef(); } class Logger { log() { console.log("Log"); } } const logger = use(Logger); // Logger logger.log(); ``` --- ### 3. Перевикористання типів екземплярів ```javascript class UserService { users = ["Alex"]; } class OrderService { orders = [1, 2, 3]; } type Services = [typeof UserService, typeof OrderService]; type Instances = InstanceType<Services[number]>; // UserService | OrderService ``` --- ## Відмінність від `typeof` | Конструкція | Що повертає | |---|---| | `typeof MyClass` | Тип **конструктора** | | `InstanceType<typeof MyClass>` | Тип **екземпляра класу** | Приклад: ```javascript class Person {} type A = typeof Person; // new (...args: any[]) => Person type B = InstanceType<A>; // Person ``` --- ## Підсумок | Питання | Відповідь | |---|---| | Що робить `InstanceType<T>`? | Видобуває тип екземпляра, що створюється конструктором `T`. | | Що можна передавати? | Тільки конструктори (`class`, `typeof class`, `new (...args) => any`). | | Що повертає? | Тип об'єкта, який створює цей конструктор. | | Що буде, якщо передати не-конструктор? | Помилка типів. |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.