export type AnyFunction = (...args: any) => any; export type AnyObject = Record; export type NestedObject = { [k: string]: NestedObject; }; /** Transform immutable objects to mutable */ export type Mutable = { -readonly [K in keyof Immutable]: Immutable[K]; }; export declare function getMutable(immutable: T[] | readonly T[]): Mutable; export type Prop = K extends keyof T ? T[K] : never; export type ValueOf = T[keyof T]; export type SomeRequired = T & { [k in K]-?: T[k]; }; type NotPossiblyUndefinedKeys = Exclude<{ [k in keyof T]: T[k] extends Exclude ? k : never; }[keyof T], undefined>; export type PossiblyUndefinedToPartial = NotPossiblyUndefinedKeys extends never ? Partial : SomeRequired, NotPossiblyUndefinedKeys>; type Hyphenize = T extends `${infer F}${infer R}` ? Kebab ? '' : '-'}${Lowercase}`> : A; type TrimHyphen = T extends `-${infer R}` ? R : T; export type Kebab = TrimHyphen>; export type NeverToUnknown = T extends never ? unknown : T; /** * A type that represents either a value of type T or a function that returns T. * Useful for avoiding circular dependencies by allowing lazy evaluation. */ export type TypeOrFunction = T | (() => T); /** * Allow you to infer the values of an object inside another object without using `as const`. * * @example * function doSomething(obj: Narrow) { * return obj * } * const something = doSomething({ args: { page: 'Int' } }) * * // `something.args.page` will be of type `'Int'` instead of `string` * * @see https://stackoverflow.com/a/75881801/1895428 */ export type Narrow = (T extends infer U ? U : never) | Extract | ([T] extends [[]] ? [] : { [K in keyof T]: K extends SpecificProps ? Narrow : never; }); export {};