// From https://github.com/mattpocock/ts-reset declare namespace TSReset { type NonFalsy = T extends false | 0 | '' | null | undefined | 0n ? never : T type WidenLiteral = T extends string ? string : T extends number ? number : T extends boolean ? boolean : T extends bigint ? bigint : T extends symbol ? symbol : T } interface JSON { parse( text: string, reviver?: (this: any, key: string, value: any) => any, ): unknown; } interface Body { json(): Promise; } interface ReadonlyArray { filter( predicate: BooleanConstructor, thisArg?: any, ): TSReset.NonFalsy[]; includes( searchElement: T | (TSReset.WidenLiteral & {}), fromIndex?: number, ): boolean; lastIndexOf( searchElement: T | (TSReset.WidenLiteral & {}), fromIndex?: number, ): number; indexOf( searchElement: T | (TSReset.WidenLiteral & {}), fromIndex?: number, ): number; } interface Array { filter( predicate: BooleanConstructor, thisArg?: any, ): TSReset.NonFalsy[]; includes( searchElement: T | (TSReset.WidenLiteral & {}), fromIndex?: number, ): boolean; lastIndexOf( searchElement: T | (TSReset.WidenLiteral & {}), fromIndex?: number, ): number; indexOf( searchElement: T | (TSReset.WidenLiteral & {}), fromIndex?: number, ): number; } interface MapConstructor { new (): Map; } // eslint-disable-next-line @typescript-eslint/no-unused-vars interface Map { has(value: K | (TSReset.WidenLiteral & {})): boolean; } // eslint-disable-next-line @typescript-eslint/no-unused-vars interface ReadonlyMap { has(value: K | (TSReset.WidenLiteral & {})): boolean; } interface Set { has(value: T | (TSReset.WidenLiteral & {})): boolean; } interface ReadonlySet { has(value: T | (TSReset.WidenLiteral & {})): boolean; } interface Promise { then( onfulfilled?: | ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: | ((reason: unknown) => TResult2 | PromiseLike) | undefined | null, ): Promise; catch( onrejected?: | ((reason: unknown) => TResult | PromiseLike) | undefined | null, ): Promise; } interface Storage { [name: string & {}]: unknown; } interface String { toLowerCase(this: T): Lowercase toUpperCase(this: T): Uppercase startsWith(this: T, searchString: T2, position?: number): this is `${T2}${string}` endsWith(this: T, searchString: T2, position?: number): this is `${string}${T2}` }