import { AbstractClass } from "type-fest" /** * Represents an array of instances corresponding to the provided classes. * @template Classes - An array of classes extending AbstractClass. */ export type ClassesInstances[]> = ( Classes extends [infer Class, ...infer Rest] ? Class extends AbstractClass ? Rest extends AbstractClass[] ? [InstanceType, ...ClassesInstances] : never : never : [] ) /** * Represents an intersection of instances of the provided classes. * @template Classes - An array of classes extending AbstractClass. */ export type ClassesInstancesIntersection[]> = ( Classes extends [infer Class, ...infer Rest] ? Class extends AbstractClass ? Rest extends AbstractClass[] ? InstanceType & ClassesInstancesIntersection : never : never : {} ) /** * Represents the static members of a class. * @template Class - A class extending AbstractClass. */ export type StaticMembers> = ( Omit ) /** * Represents an array of static members corresponding to the provided classes. * @template Classes - An array of classes extending AbstractClass. */ export type ClassesStaticMembers[]> = ( Classes extends [infer Class, ...infer Rest] ? Class extends AbstractClass ? Rest extends AbstractClass[] ? [StaticMembers, ...ClassesStaticMembers] : never : never : [] ) /** * Represents an intersection of static members of the provided classes. * @template Classes - An array of classes extending AbstractClass. */ export type ClassesStaticMembersIntersection[]> = ( Classes extends [infer Class, ...infer Rest] ? Class extends AbstractClass ? Rest extends AbstractClass[] ? StaticMembers & ClassesStaticMembersIntersection : never : never : {} )