interface RecursiveArray extends Array> {} interface ListOfRecursiveArraysOrValues extends Array> {} type RecursivePartial = { [P in keyof T]?: T[P] extends (infer U)[] ? RecursivePartial[] : T[P] extends object ? RecursivePartial : T[P]; }; interface Array { isArray(x: any): x is RecursiveArray; }