type DataCounty = {
    name: string,
    short: string | null,
    deprecated: string | null,
    ended: true,
}
type DataZone = {
    name: string,
    short: string | null,
    deprecated: string | null,
    ended: true,
    parent: string | null,
}

type DataCounties = {
    [county: string]: DataCounty,
}
type DataZones = {
    [county: string]: DataZone,
}

type DataPrefecture = {
    name: string,
    short: string | null,
    deprecated: string | null,
    ended: boolean,
    children: DataCounties,
}
type DataClassification = {
    name: string,
    short: string | null,
    deprecated: string | null,
    ended: boolean,
    children: DataZones,
}

type DataPrefectures = {
    [prefecture: string]: DataPrefecture,
}
type DataClassifications = {
    [classification: string]: DataClassification,
}

type DataProvince<T extends DataPrefectures | DataClassifications> = {
    name: string,
    short: string | null,
    deprecated: string | null,
    ended: boolean,
    children: T,
}

type Data<T extends DataPrefectures | DataClassifications> = {
    [province: string]: DataProvince<T>,
}

declare class Region {
    private readonly level;
    private readonly codeS;
    private readonly codeI;
    private readonly name;
    private readonly short;
    private readonly deprecated;
    private readonly ended;
    constructor(level: 0 | 1 | 2 | 3, code: string, name: string, short: string | null, deprecated: string | null, ended: boolean);
    getLevel(): 0 | 1 | 2 | 3;
    getCodeString(): string;
    getCodeInteger(): number;
    getName(): string;
    getShortName(): string;
    isDeprecated(): boolean;
    isEnded(): boolean;
}
declare class County extends Region {
    private readonly parent;
    constructor(code: string, data: DataCounty | DataZone, parent: Prefecture);
    getFullCodeString(): string;
    getFullCodeInteger(): number;
    getFullName(separator?: string): string;
    getFullShortName(separator?: string): string;
    getParent(): Prefecture;
}
declare class Prefecture extends Region {
    private readonly children;
    private readonly childrenNotDeprecated;
    private readonly parent;
    constructor(code: string, data: DataPrefecture | DataClassification, parent: Province);
    getFullCodeString(): string;
    getFullCodeInteger(): number;
    getFullName(separator?: string): string;
    getFullShortName(separator?: string): string;
    listChildren(includeDeprecated?: boolean): County[];
    private getChildren;
    getParent(): Province;
    getChild(code: string | number, couldBeDeprecated?: boolean): County | null;
}
declare class Province extends Region {
    private readonly children;
    private readonly childrenNotDeprecated;
    constructor(code: string, data: DataProvince<DataPrefectures | DataClassifications>);
    getFullCodeString(): string;
    getFullCodeInteger(): number;
    getFullName(_?: string): string;
    getFullShortName(_?: string): string;
    listChildren(includeDeprecated?: boolean): Prefecture[];
    private getChildren;
    getChild(code: string | number, couldBeDeprecated?: boolean): Prefecture | null;
}
declare class China extends Region {
    private readonly children;
    private readonly childrenNotDeprecated;
    constructor(data: Data<DataPrefectures | DataClassifications>);
    listChildren(includeDeprecated?: boolean): Province[];
    private getChildren;
    getChild(code: string | number, couldBeDeprecated?: boolean): Province | null;
}
declare const _default: China;

export { County, Prefecture, Province, _default as default };
