import { AtomTemplateBase, Ecosystem } from '@zedux/atoms';
import { AtomInstance } from './AtomInstance';
import { AnyAtomGenerics, AtomGenerics, AtomValueOrFactory } from './types';
export type AtomInstanceRecursive<G extends Omit<AtomGenerics, 'Node' | 'Template'>> = AtomInstance<G & {
    Node: AtomInstanceRecursive<G>;
    Template: AtomTemplateRecursive<G>;
}>;
export type AtomTemplateRecursive<G extends Omit<AtomGenerics, 'Node' | 'Template'>> = AtomTemplate<G & {
    Node: AtomInstanceRecursive<G>;
    Template: AtomTemplateRecursive<G>;
}>;
export declare class AtomTemplate<G extends AtomGenerics & {
    Node: AtomInstanceRecursive<G>;
    Template: AtomTemplateRecursive<G>;
} = AnyAtomGenerics> extends AtomTemplateBase<G> {
    /**
     * This method should be overridden when creating custom atom classes that
     * create a custom atom instance class. Return a new instance of your atom
     * instance class.
     */
    _createInstance(ecosystem: Ecosystem, id: string, params: G['Params']): G['Node'];
    getInstanceId(ecosystem: Ecosystem, params?: G['Params']): string;
    override(newValue: AtomValueOrFactory<G>): AtomTemplate<G>;
}
