declare namespace Temporal {
  interface Now {
    instant(): Instant;
    plainDateISO(timeZone?: string): PlainDate;
    plainDateTimeISO(timeZone?: string): PlainDateTime;
    plainTimeISO(timeZone?: string): PlainTime;
    timeZoneId(): string;
    zonedDateTimeISO(timeZone?: string): ZonedDateTime;
  }

  interface Duration {
    total(options: unknown): number;
    round(options: unknown): Duration;
  }

  interface Instant {
    round(options: unknown): Instant;
  }

  interface PlainDate {
    with(info: unknown): PlainDate;
  }

  interface PlainDateTime {
    with(info: unknown): PlainDateTime;
    round(options: unknown): PlainDateTime;
  }

  interface PlainTime {
    with(info: unknown): PlainTime;
    round(options: unknown): PlainTime;
  }

  interface ZonedDateTime {
    with(info: unknown): ZonedDateTime;
    round(options: unknown): ZonedDateTime;
    getTimeZoneTransition(
      options: "next" | "previous" | { direction: "next" | "previous" }
    ): ZonedDateTime | null;
  }
}
