Skip to main content

Що робить InstanceType<T>?

Що робить 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).
Що повертає?Тип об'єкта, який створює цей конструктор.
Що буде, якщо передати не-конструктор?Помилка типів.

Коротка відповідь

Для співбесіди
Premium

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