// eslint-disable-next-line @typescript-eslint/no-explicit-any type TMockFn = jest.Mock; type TNumber = number | bigint; type TConstructor = { new (...args: never): T; }; type TFunction = ( ...args: Args ) => R; type TPromisify = T extends (...args: never[]) => unknown ? (...args: Parameters) => Promise> : never; type TPromisifyAll = { readonly [K in keyof T]: TPromisify; }; type TExpectAsync = Omit>, `not`> & { readonly not: TPromisifyAll>; }; export type TExpect = { readonly not: TExpect; readonly resolves: T extends Promise ? TExpectAsync : never; readonly rejects: T extends Promise ? TExpectAsync : never; readonly toBe: (result: T) => void; readonly toHaveBeenCalled: T extends TMockFn ? () => void : never; readonly toBeCalled: T extends TMockFn ? () => void : never; readonly toHaveBeenCalledTimes: T extends TMockFn ? (n: number) => void : never; readonly toBeCalledTimes: T extends TMockFn ? (n: number) => void : never; readonly toHaveBeenCalledWith: T extends TMockFn ? (...args: Parameters) => void : never; readonly toBeCalledWith: T extends TMockFn ? (...args: Parameters) => void : never; readonly toHaveBeenLastCalledWith: T extends TMockFn ? (...args: Parameters) => void : never; readonly lastCalledWith: T extends TMockFn ? (...args: Parameters) => void : never; readonly toHaveBeenNthCalledWith: T extends TMockFn ? (n: number, ...args: Parameters) => void : never; readonly nthCalledWith: T extends TMockFn ? (n: number, ...args: Parameters) => void : never; readonly toHaveReturned: T extends TMockFn ? () => void : never; readonly toReturn: T extends TMockFn ? () => void : never; readonly toHaveReturnedTimes: T extends TMockFn ? (n: number) => void : never; readonly toReturnTimes: T extends TMockFn ? (n: number) => void : never; readonly toHaveReturnedWith: T extends TMockFn ? (value: ReturnType) => void : never; readonly toReturnWith: T extends TMockFn ? (value: ReturnType) => void : never; readonly toHaveLastReturnedWith: T extends TMockFn ? (value: ReturnType) => void : never; readonly lastReturnedWith: T extends TMockFn ? (value: ReturnType) => void : never; readonly toHaveNthReturnedWith: T extends TMockFn ? (n: number, value: ReturnType) => void : never; readonly nthReturnedWith: T extends TMockFn ? (n: number, value: ReturnType) => void : never; readonly toHaveLength: T extends { readonly length: number; } ? (length: number) => void : never; // We only support direct property key, no array of keys or dot-separated paths readonly toHaveProperty: (key: K, value?: T[K]) => void; readonly toBeCloseTo: T extends TNumber ? (n: TNumber, digits?: number) => void : never; readonly toBeDefined: undefined extends T ? () => void : never; readonly toBeFalsy: () => void; readonly toBeGreaterThan: T extends TNumber ? (n: TNumber) => void : never; readonly toBeGreaterThanOrEqual: T extends TNumber ? (n: TNumber) => void : never; readonly toBeLessThan: T extends TNumber ? (n: TNumber) => void : never; readonly toBeLessThanOrEqual: T extends TNumber ? (n: TNumber) => void : never; readonly toBeInstanceOf: T extends object ? (Class: TConstructor) => void : never; readonly toBeNull: null extends T ? () => void : never; readonly toBeTruthy: () => void; readonly toBeUndefined: undefined extends T ? () => void : never; readonly toBeNaN: T extends number ? () => void : never; readonly toContain: T extends Readonly> ? (item: U) => void : never; readonly toContainEqual: T extends Readonly> ? (item: U) => void : never; readonly toEqual: (result: T) => void; readonly toMatch: T extends string ? (match: RegExp | string) => void : never; // We only support matching a single object, not an array. readonly toMatchObject: (result: Partial) => void; readonly toMatchSnapshot: ( propertyMatchers?: Partial, hint?: string, ) => void; readonly toMatchInlineSnapshot: ( propertyMatchers: Partial, inlineSnapshot: string, ) => void; readonly toStrictEqual: (result: T) => void; readonly toThrow: T extends TFunction ? (error?: unknown) => void : never; readonly toThrowError: T extends TFunction ? (error?: unknown) => void : never; readonly toThrowErrorMatchingSnapshot: T extends TMockFn ? (hint?: string) => void : never; readonly toThrowErrorMatchingInlineSnapshot: T extends TMockFn ? (inlineSnapshot: string) => void : never; }; export const tExpect = (t: T): TExpect => expect(t) as unknown as TExpect;