import type { InitializableBaseProperties } from "./support/InitializableBase.js";
import { InitializableBase } from "./support/InitializableBase.js";
import type { PropertyDefs } from "./support/Serializable.js";
import { generateUuid as generateId } from "./utilities/uuid.js";
export { generateId };
/**
 * Represents an entity. Entities are objects that are fundamentally defined by
 * an identity rather than their attributes. An entity's attributes can change
 * over time, yet it will still retain a continuous thread of identity.
 */
export interface Entity {
    /**
     * The unique ID for this entity.
     */
    readonly id: string;
    /**
     * The item type for this entity when it participates in an App.
     */
    readonly itemType: string;
    /**
     * Creates an item:// URI reference to this entity.
     */
    toItemUri(): string;
}
/**
 * Serializable properties for {@link Entity}.
 */
export interface EntityProperties {
    /**
     * The unique ID to assign to the entity. If not specified, one will be
     * generated.
     */
    id?: string;
}
/**
 * Properties that can be passed into the constructor for {@link EntityBase}.
 */
export interface EntityBaseProperties extends EntityProperties, InitializableBaseProperties {
}
/**
 * Default implementation of an {@link Entity} that supports observability,
 * serialization, and async initialization.
 */
export declare abstract class EntityBase<TProperties extends EntityBaseProperties = EntityBaseProperties> extends InitializableBase<TProperties> implements Entity {
    /**
     * @inheritDoc
     */
    get id(): string;
    /**
     * The item type for this entity when it participates in an App.
     */
    get itemType(): string;
    /**
     * The item type for this entity when it participates in an App.
     */
    protected abstract readonly _itemType: string;
    /**
     * The unique ID for this entity. Once set, this should never change.
     */
    protected _id: string;
    /**
     * Creates a new instance of the entity and assigns the given properties.
     *
     * @param properties The properties to set via assignProperties().
     */
    constructor(properties?: TProperties);
    /**
     * @inheritDoc
     */
    toItemUri(): string;
    protected _getSerializableProperties(): PropertyDefs<TProperties>;
}
