import type Collection from "@arcgis/core/core/Collection";
import type FeatureLayer from "@arcgis/core/layers/FeatureLayer";
import type Layer from "@arcgis/core/layers/Layer";
import type FeatureType from "@arcgis/core/layers/support/FeatureType";
import type Field from "@arcgis/core/layers/support/Field";
import type { RendererUnion } from "@arcgis/core/renderers/types.js";
import type { Feature } from "../data/Feature.js";
import type { FeatureSettings } from "../data/FeatureSettings.js";
import type { FeatureReadOptions } from "../data/FeatureSource.js";
import type { QuerySourceCapabilities } from "../data/QuerySourceCapabilities.js";
import type { Schema } from "../data/Schema.js";
import { TaskSettings } from "../data/TaskSettings.js";
import { type FeatureLayerJson } from "../json/FeatureLayerJson.js";
import type { PropertyDefs } from "../support/Serializable.js";
import type { LayerExtensionProperties, LayerProperties, LayerExtensionSchemaPropertyBinding } from "./_LayerExtension.js";
import { LayerExtension, LayerExtensionSchema } from "./_LayerExtension.js";
/**
 * Properties that can be passed into the constructor for
 * {@link FeatureLayerExtensionBase}.
 */
export interface FeatureLayerExtensionBaseProperties extends LayerExtensionProperties {
    /**
     * The Esri FeatureLayer object being extended.
     */
    layer?: FeatureLayer | FeatureLayerBaseProperties;
}
/**
 * Properties that can be specified for the
 * {@link FeatureLayerExtensionBaseProperties.layer} property.
 */
export interface FeatureLayerBaseProperties extends FeatureLayerJson, Omit<LayerProperties, "layerType"> {
}
/**
 * Extends the capabilities of an Esri `FeatureLayer` object.
 */
export declare abstract class FeatureLayerExtensionBase<TProperties extends FeatureLayerExtensionBaseProperties = FeatureLayerExtensionBaseProperties> extends LayerExtension<TProperties> {
    get hasFeatures(): boolean;
    get layer(): FeatureLayer;
    get renderer(): RendererUnion | undefined;
    get canChangeDefinitionExpression(): boolean;
    get canChangeRenderer(): boolean;
    protected _getFeatures(ids: string[], options?: FeatureReadOptions): AsyncIterable<Feature>;
    protected _applyLayerProperties(properties: FeatureLayerBaseProperties, layer: FeatureLayer): Promise<void>;
    protected _getSerializableProperties(): PropertyDefs<TProperties>;
    protected _createSchema(): Schema;
    /**
     * @inheritDoc
     */
    protected _isSupportedLayer(layer: Layer): boolean;
    protected _createFeatureSettings(): FeatureSettings;
    protected _createTaskSettings(): TaskSettings;
    protected _capabilities(): QuerySourceCapabilities;
}
/**
 * An implementation of Schema that directly mirrors the equivalent properties
 * on FeatureLayer.
 */
export declare class FeatureLayerSchema extends LayerExtensionSchema {
    private readonly _fieldCollection;
    private readonly _typesCollection;
    constructor(layerExtension: LayerExtension);
    get types(): Collection<FeatureType>;
    destroy(): void;
    /**
     * Creates the backing collection for fields.
     */
    protected _createFieldCollection(): Collection<Field>;
    /**
     * Creates the backing collection for types.
     */
    protected _createTypeCollection(): Collection<FeatureType>;
    protected _getPropertyBindings(): Partial<Record<keyof this, LayerExtensionSchemaPropertyBinding>>;
}
/**
 * An implementation of Schema that directly mirrors the equivalent properties
 * on FeatureLayer for reading, and disallows updating.
 */
export declare class FeatureLayerReadOnlySchema extends FeatureLayerSchema {
    protected _setSetting<K extends keyof this>(setting: K, value: this[K]): void;
    protected _createFieldCollection(): Collection<Field>;
    protected _createTypeCollection(): Collection<FeatureType>;
}
