ecsjs
Version:
An entity component system library for JavaScript
61 lines (53 loc) • 1.66 kB
text/typescript
export const ComponentMapKey = "ComponentMap"
export const ComponentClassesMapKey = "ComponentClassesMap"
export type KeyCollection<T> = { [key: string]: T }
export interface Component { }
/**
* @category Types
* @example
*
* class PositionComponent {
* constructor(x, y) {
* this.x = x;
* this.y = y;
* }
* }
*/
export type ComponentClass<ComponentInstance> = new (...args: any[]) => ComponentInstance
/**
* Used for infering generic type spread for classes
*/
export type ComponentClasses<TClasses extends Component[]> =
{ [Index in keyof TClasses]: TClasses[Index] }
/**
* Used for infering generic type spread for class instances
*/
export type ComponentInstances<TClasses extends ComponentClass<any>[]> =
// return a single variadic item when only 1 item is specified
TClasses['length'] extends 1 ? TClasses[0] extends ComponentClass<infer R> ? R : never
// otherwise return an array of variadic types
: {
[Index in keyof TClasses]: TClasses[Index] extends ComponentClass<infer R> ? R : never
}
export type IteratorResult<T> = {
done: boolean,
value: T
}
export type Iterator<T> = {
next: () => IteratorResult<T>
reset: () => void
[Symbol.iterator]: () => Iterator<T>
}
/**
* allow late bound assignment type for intellisense
* @category Types
* @example
*
* let someIterator: IComponentIterator<[Player, Position]>
*
* // assignment made somewhere else in the code
* const [player, position] = someIterator(Player, Position) ?? []
* position?.x = 123 // position will have intellisense
*/
export type IComponentIterator<T extends Component[]>
= Iterator<ComponentClasses<[number, ...T]>>