67 lines
2.2 KiB
TypeScript
67 lines
2.2 KiB
TypeScript
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 readonly AbstractClass<any>[]> = (
|
|
Classes extends [infer Class, ...infer Rest]
|
|
? Class extends AbstractClass<any>
|
|
? Rest extends AbstractClass<any>[]
|
|
? [InstanceType<Class>, ...ClassesInstances<Rest>]
|
|
: never
|
|
: never
|
|
: []
|
|
)
|
|
|
|
/**
|
|
* Represents an intersection of instances of the provided classes.
|
|
* @template Classes - An array of classes extending AbstractClass.
|
|
*/
|
|
export type ClassesInstancesIntersection<Classes extends readonly AbstractClass<any>[]> = (
|
|
Classes extends [infer Class, ...infer Rest]
|
|
? Class extends AbstractClass<any>
|
|
? Rest extends AbstractClass<any>[]
|
|
? InstanceType<Class> & ClassesInstancesIntersection<Rest>
|
|
: never
|
|
: never
|
|
: {}
|
|
)
|
|
|
|
/**
|
|
* Represents the static members of a class.
|
|
* @template Class - A class extending AbstractClass.
|
|
*/
|
|
export type StaticMembers<Class extends AbstractClass<any>> = (
|
|
Omit<Class, "prototype">
|
|
)
|
|
|
|
/**
|
|
* Represents an array of static members corresponding to the provided classes.
|
|
* @template Classes - An array of classes extending AbstractClass.
|
|
*/
|
|
export type ClassesStaticMembers<Classes extends readonly AbstractClass<any>[]> = (
|
|
Classes extends [infer Class, ...infer Rest]
|
|
? Class extends AbstractClass<any>
|
|
? Rest extends AbstractClass<any>[]
|
|
? [StaticMembers<Class>, ...ClassesStaticMembers<Rest>]
|
|
: 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 readonly AbstractClass<any>[]> = (
|
|
Classes extends [infer Class, ...infer Rest]
|
|
? Class extends AbstractClass<any>
|
|
? Rest extends AbstractClass<any>[]
|
|
? StaticMembers<Class> & ClassesStaticMembersIntersection<Rest>
|
|
: never
|
|
: never
|
|
: {}
|
|
)
|