/** Type alias for something that may or may not be wrapped in a promise. */ export type Awaitable = T | Promise /** Type alias for something that may be undefined. */ export type Maybe = T | undefined /** Type alias for a callback that accepts a typed argument. */ export type ParameterizedCallback = ((arg: T) => any) /** A key-value form of a given type. */ export type KeyValue = {key: string, value: T} /** Simple helper method to verify that a key is a keyof some object. */ export function isKeyof(key: unknown, obj: T): key is keyof T { if ( typeof key !== 'string' && typeof key !== 'symbol' ) { return false } return key in obj } /** A typescript-compatible version of Object.hasOwnProperty. */ export function hasOwnProperty(obj: X, prop: Y): obj is X & Record { // eslint-disable-line @typescript-eslint/ban-types return Object.hasOwnProperty.call(obj, prop) }