@rimbu/base
Version:
Utilities to implement Rimbu collections
63 lines (62 loc) • 2.43 kB
text/typescript
/**
* Matches any type of function
*/
export type AnyFunc = (...args: any[]) => any;
/**
* Gives true if the given type T is a function, false otherwise.
* @typeparam T - the input type
*/
export type IsAnyFunc<T> = AnyFunc extends T ? true : false;
/**
* A predicate type for any record that resolves to true if any of the record
* properties is a function, false otherwise.
* This is useful to have a coarse discrimination between pure data objects and class instances.
* @typeparam T - the input type
*/
export type IsObjWithoutFunctions<T> = AnyFunc extends T[keyof T] ? false : true;
/**
* A predicate type that resolves to true if the given type satisfies:
* - it is an object type (not a primitive)
* - it is not a function
* - it is not iterable
* - it does not have any properties that are functions
* Otherwise, it resolves to false
* @typeparam T - the input type
*/
export type IsPlainObj<T> = T extends null | undefined | number | string | boolean | bigint | symbol | AnyFunc | Iterable<any> | AsyncIterable<any> ? false : IsObjWithoutFunctions<T>;
/**
* Utility type that will only accept objects that are considered 'plain objects' according
* to the `IsPlainObj` predicate type.
* @typeparam T - the value type to test
*/
export type PlainObj<T> = IsPlainObj<T> extends true ? T : never;
/**
* Utility type that will only return true if the input type T is equal to `any`.
* @typeparam T - the value type to test
*/
export type IsAny<T> = 0 extends 1 & T ? true : false;
/**
* Utility type that will only return true if the input type T is a (readonly) array.
* @typeparm T - the value type to test
*/
export type IsArray<T> = T extends readonly any[] ? true : false;
/**
* Utility type to exclude any types that are iterable. Useful in cases where
* plain objects are required as inputs but not arrays.
*/
export type NotIterable = {
[Symbol.iterator]?: never;
};
/**
* Companion function to the `IsRecord<T>` type that checks whether the given object is a pure
* data object.
* @param obj - the object to check
* @returns true if the given object is a pure data object
* @note does not check whether a record's properties are not functions
*/
export declare function isPlainObj(obj: any): obj is object;
/**
* Returns true if the given object is Iterable
* @param obj - the object to check
*/
export declare function isIterable(obj: any): obj is Iterable<unknown>;