interface Type<T> extends Function {
    new(...args: any[]): T;
}

export class EntityComponentDataset {
    public hasComponent<T>(entity: number, component: Type<T>): boolean

    public getComponent<T>(entity: number, component: Type<T>): T | undefined

    public getComponentSafe<T>(entity: number, component: Type<T>): T

    public addComponentToEntity<T>(entityIndex: number, componentInstance: T): void

    public removeComponentFromEntity<T>(entityIndex: number, klass: Type<T>): void

    public setComponentTypeMap(types: any[]): void;

    public registerComponentType<T>(componentType: Type<T>): boolean

    public registerManyComponentTypes(componentTypes: Type<any>[]): boolean

    public createEntity(): number

    public createEntitySpecific(entityId: number): void

    public removeEntity(entityIndex: number): boolean

    public removeEntities(entityIndices: number[]): void

    public entityExists(entityIndex: number): boolean

    public traverseEntities(classes: any[], visitor: (...params: any) => boolean, thisArg?: any): void

    public traverseComponents<T>(klass: Type<T>, visitor: (component: T, entity: number) => boolean, thisArg?: any): void

    public addEntityEventListener<T>(entity: number, eventName: string, listener: (event: T, entity?: number) => any, thisArg?: any)

    public removeEntityEventListener<T>(entity: number, eventName: string, listener: (event: T, entity?: number) => any, thisArg?: any);

    public sendEvent<T>(entity: number, name: string, event?: T);

    public getComponentClassByName<T>(name: string): Type<T>;

    getAnyComponent<T>(type: Type<T>): { entity: number, component: T | null }
}
