import type { Entity, FilteredEntity } from "./types";
export default class EntityManager<ComponentTypes> {
    private nextId;
    private entities;
    private componentIndices;
    createEntity(): Entity<ComponentTypes>;
    addComponent<ComponentName extends keyof ComponentTypes>(entityOrId: number | Entity<ComponentTypes>, componentName: ComponentName, data: ComponentTypes[ComponentName]): this;
    /**
     * Add multiple components to an entity at once
     * @param entityOrId Entity or entity ID to add components to
     * @param components Object with component names as keys and component data as values
     */
    addComponents<T extends {
        [K in keyof ComponentTypes]?: ComponentTypes[K];
    }>(entityOrId: number | Entity<ComponentTypes>, components: T & Record<Exclude<keyof T, keyof ComponentTypes>, never>): this;
    removeComponent<ComponentName extends keyof ComponentTypes>(entityId: number, componentName: ComponentName): void;
    getComponent<ComponentName extends keyof ComponentTypes>(entityId: number, componentName: ComponentName): ComponentTypes[ComponentName] | null;
    getEntitiesWithComponents<WithComponents extends keyof ComponentTypes = never, WithoutComponents extends keyof ComponentTypes = never>(required?: ReadonlyArray<WithComponents>, excluded?: ReadonlyArray<WithoutComponents>): Array<FilteredEntity<ComponentTypes, WithComponents extends never ? never : WithComponents, WithoutComponents extends never ? never : WithoutComponents>>;
    removeEntity(entityOrId: number | Entity<ComponentTypes>): boolean;
    getEntity(entityId: number): Entity<ComponentTypes> | undefined;
}
