import { ExtFitField, FitMessageInputs, FitMessageMap, UserMessage, UserMessageMap, fit_messages, fit_types } from "./fit-tables";
type keysOf<o> = {
    [K in keyof o]: K extends string ? K : K extends number ? `${K}` : never;
}[keyof o];
export { fit_messages, UserMessageMap };
export declare function keysOf<o extends object>(o: o): keysOf<o>[];
type Exact<Target, T> = {
    [K in keyof T]: K extends keyof Target ? T[K] : never;
};
type Merge<T, U> = Omit<T, keyof U> & U;
type FitTypes = typeof fit_types;
type FitTypeKeys = keyof FitTypes;
type ExcludeSpecial<T, E extends string = never> = Exclude<T, "_min" | "_max" | `${number}` | E>;
type TypeFromFitType<T extends FitTypeKeys> = FitTypes[T] extends {
    mask: number;
} ? {
    value: number;
    options?: ExcludeSpecial<keyof FitTypes[T], "mask">[];
} : ExcludeSpecial<keyof FitTypes[T]>;
type TypeFromField<F extends ExtFitField | undefined> = F extends ExtFitField ? F["base_type"] extends "string" ? string : F["array"] extends true ? number[] : F["type"] extends FitTypeKeys ? TypeFromFitType<F["type"]> : number : undefined;
type TypeFromMessage<M extends UserMessage> = {
    [K in keyof M["fields"]]: TypeFromField<M["fields"][K]>;
};
type TypeFromMessages<M extends UserMessageMap> = {
    [K in keyof M]: TypeFromMessage<M[K]>;
};
type FitMessages<UserMessages> = {
    [K in keyof FitMessageInputs | keyof UserMessages]: K extends keyof FitMessageInputs ? K extends keyof UserMessages ? Merge<FitMessageInputs[K], UserMessages[K]> : FitMessageInputs[K] : K extends keyof UserMessages ? UserMessages[K] : never;
};
type FitMessageTypes<U extends UserMessageMap | null> = U extends UserMessageMap ? FitMessages<TypeFromMessages<U>> : FitMessageInputs;
export type FitDevInfo = {
    field_num: number;
    value: number | number[] | string;
};
export type FitWriterOptions = {
    noCompressedTimestamps?: boolean;
    usePreferredRecords?: boolean;
};
export declare class FitWriter {
    private buffer;
    private offset;
    private crc;
    private definitionMap;
    private nextLocalDef;
    private localDefs;
    private scratch;
    private devFieldTypes;
    private lastTimeStamp;
    private options;
    private ensureSpace;
    constructor(options?: FitWriterOptions | boolean);
    private write_crc;
    private update_crc;
    private byte;
    private word;
    private long;
    private float;
    private double;
    private str;
    private field;
    private definition;
    private file_header;
    private dev_field_key;
    time(t: number | Date): number;
    latlng<T extends number | undefined>(l: T): T;
    finish(): DataView;
    private writeFieldValue;
    getPreferredField(message: FitMessageMap[string], key: string): ExtFitField;
    writeCustomMessage<S extends UserMessageMap | null, T extends keyof FitMessageInputs | (S extends UserMessageMap ? keyof FitMessageTypes<S> : never), U extends Partial<FitMessageTypes<S>[T]>>(userMessages: S, messageType: T, messageInfo: U & Exact<FitMessageTypes<S>[T], U>, devInfo?: FitDevInfo[] | null, lastUse?: boolean): void;
    writeMessage<T extends keyof FitMessageInputs, U extends Partial<FitMessageInputs[T]>>(messageType: T, messageInfo: U & Exact<FitMessageInputs[T], U>, devInfo?: FitDevInfo[] | null, lastUse?: boolean): void;
}
