UNPKG

ecsjs

Version:

An entity component system library for JavaScript

61 lines (53 loc) 1.66 kB
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]>>