import { ScaleContinuousNumeric, ScaleTime, ScaleBand } from 'd3-scale';
import { ScaleType, ScaleRange, ChartDomain, CategoricalDomain, DateDomain, NumericDomain } from './interfaces';
declare type InternalScale = ScaleContinuousNumeric<number, number> | ScaleBand<string> | ScaleTime<number, number>;
interface NumericD3Scale {
    type: 'numeric';
    scale: ScaleContinuousNumeric<number, number>;
}
interface TimeD3Scale {
    type: 'time';
    scale: ScaleTime<number, number>;
}
interface CategoricalD3Scale {
    type: 'categorical';
    scale: ScaleBand<string>;
}
export declare type D3Scale = NumericD3Scale | TimeD3Scale | CategoricalD3Scale;
export declare function createScale(type: ScaleType, domain: ChartDomain, range: ScaleRange): D3Scale;
export declare class ChartScale {
    readonly scaleType: ScaleType;
    readonly domain: ChartDomain;
    readonly range: ScaleRange;
    readonly scale: D3Scale;
    readonly d3Scale: InternalScale;
    constructor(scaleType: ScaleType, domain: ChartDomain, range: ScaleRange);
    cloneScale(newScaleType?: ScaleType): ChartScale;
    isNumeric(): this is {
        d3Scale: ScaleContinuousNumeric<number, number>;
        domain: NumericDomain;
    };
    isTime(): this is {
        d3Scale: ScaleTime<number, number>;
        domain: DateDomain;
    };
    isCategorical(): this is {
        d3Scale: ScaleBand<string>;
        domain: CategoricalDomain;
    };
    numericD3Scale(): ScaleContinuousNumeric<number, number> | null;
    timeD3Scale(): ScaleTime<number, number> | null;
    categoricalD3Scale(): ScaleBand<string> | null;
}
export {};
