import { isNonNullable } from './fnUtils'; export function isObject(value: T): value is T & object { return isNonNullable(value) && typeof value === 'object'; } /* eslint-disable @typescript-eslint/no-explicit-any */ // https://stackoverflow.com/a/74608626 type Intersect = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never; // https://stackoverflow.com/a/52991061 // eslint-disable-next-line @typescript-eslint/ban-types type OptionalKeys = { [K in keyof T]-?: {} extends Pick ? K : never }[keyof T]; export function hasOwnProperty>( val: T, prop: K, ): val is T & { [P in K]-?: T[P] }; export function hasOwnProperty(val: T, prop: K): boolean; export function hasOwnProperty>( val: T, prop: K, ): val is Extract ? { [P in K]?: any } : { [P in K]: any }>; export function hasOwnProperty(val: T, prop: PropertyKey) { return Object.prototype.hasOwnProperty.call(val, prop); } /* eslint-enable @typescript-eslint/no-explicit-any */