declare namespace MessageFormat {
  type Msg = { (params: {}): string; toString(global?: string): string };
  type Formatter = (val: any, lc: string, arg?: string) => string;
  type SrcMessage = string | SrcObject;

  interface SrcObject {
    [key: string]: SrcMessage;
  }

  interface Options {
    biDiSupport?: boolean;
    customFormatters?: { [name: string]: Formatter };
    pluralKeyChecks?: boolean;
    strictNumberSign?: boolean;
  }
}

declare class MessageFormat {
  constructor(
    locales?: { [locale: string]: Function } | string[] | string,
    options?: MessageFormat.Options
  );
  addFormatters: (format: { [name: string]: MessageFormat.Formatter }) => this;
  disablePluralKeyChecks: () => this;
  setBiDiSupport: (enable: boolean) => this;
  setStrictNumberSign: (enable: boolean) => this;
  compile: (
    messages: MessageFormat.SrcMessage,
    locale?: string
  ) => MessageFormat.Msg;
}

export = MessageFormat;