/**
 * Type that returns the list of fields in Base, that are not part of Provided
 *
 * @param Base The base object
 * @param Provided The object whose fields should be omitted from the field list of base
 */
type StillToProvideVerifyKeys<Base, Provided> = keyof Omit<Base, keyof Provided>;
/**
 * Type that returns the Base type, with only those properties, that are not part of Provided
 *
 * @param Base The base object
 * @param Provided The object whose fields should be omitted from base
 */
type StillToProvideProperties<Base, Provided> = {
    [key in StillToProvideVerifyKeys<WithoutOptionalFields<Base>, WithoutOptionalFields<Provided>>]: Base[key];
};
/**
 * Type that returns all optional fields of the input type
 *
 * @param T The type to extract optional fields from
 */
type ExtractOptionalFields<T> = {
    [P in keyof T]-?: undefined extends T[P] ? P : never;
}[keyof T];
/**
 * Type that is similar to the input type, but only contains its mandatory properties
 *
 * @param T The type to return without optional fields
 */
type WithoutOptionalFields<T> = Omit<T, ExtractOptionalFields<T>>;
/**
 * Type that returns merged properties as follows:
 * - Properties in Base that are not in Provided, are mandatory
 * - Properties in Base that are in Provided, are optional
 */
export type Properties<Base, Provided> = StillToProvideProperties<Base, Provided> & Partial<Base>;
export type AsAsync<T extends (...args: any[]) => unknown> = (...args: Parameters<T>) => Promise<ReturnType<T>>;
export {};