Що робить 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; // string2. З класом з конструктором
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>;
// Base5. Із вбудованими конструкторами
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: Product2. Контейнер 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
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.