declare namespace OO { type Constructor = new(...args: any) => any; type ConstructorLike = (new(...args: any) => any) | ((...args: any) => any); type ValidKey = string | number; interface Cloneable { clone: (...args: any) => any; } interface NodeLike { cloneNode: (...args: any) => any; } type NonPlainObject = | string | number | boolean | symbol | bigint | null | undefined // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type | Function | NodeLike | Cloneable; type GetProp = T extends Partial> ? T[K] : undefined; // Simulate infer constraints of TypeScript 4.7+ type ConstrainedInference = R; type ValueOf = T extends any[] ? T[number] : T[keyof T]; type RecursivelyGet = { done: GetProp; recur: K extends [ ConstrainedInference, ...ConstrainedInference, ] ? RecursivelyGet, RestKeys> : never; }[K extends [ValidKey] ? "done" : "recur"]; type NodesOf = { done: T; recur: | T | ValueOf | NodesOf< Exclude, NonPlainObject>, [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][D] >; }[D extends -1 ? "done" : T extends NonPlainObject ? "done" : "recur"]; type LeavesOf = T extends NonPlainObject ? T : Extract, NonPlainObject>; type FunctionFieldsOf any, K extends keyof T = keyof T> = K extends any ? T[K] extends F ? K : never : never; type EventHandler any = (this: C, ...args: any[]) => void> = | FunctionFieldsOf | F; type ArgTuple = [] | [any] | [any, any] | [any, any, any] | [any, any, any, any] | [any, any, any, any, any]; type EventConnectionMap = { [K in keyof T]: EventConnectionMapEntry)[K], T[K]>; }; type EventConnectionMapEntry = T extends ArgTuple ? [EventHandler void>, ...T] : EventHandler void>; }