type ObjectId = string type Env = 'test' | 'development' | 'production' | 'preprod' | 'build' | 'ci' type MaybeArray = T | T[] type MaybePromise = T | Promise type HasKeys = keyof T extends never ? false : true type FunctionGeneric = (...params: any[]) => any type ObjectGeneric = { [k: string]: any } type ObjectWithNoFn = { [name: string]: NotFunction } // eslint-disable-next-line @typescript-eslint/ban-types type NotFunction = T extends Function ? never : T type AsType = T extends Type ? T : Type type AsString = AsType type Complete = { [P in keyof Required]: T[P]; } type Override = Omit & T2 type RecursivePartial = { [P in keyof T]?: T[P] extends (infer U)[] ? RecursivePartial[] : T[P] extends object ? RecursivePartial : T[P]; } type Letters = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' type SimpleNumbers = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 type ArrayOneOrMore = { 0: T } & Array type RecursiveObjValueType = { [K in keyof T]?: T[K] extends object ? Type | RecursiveObjValueType : Type; } type TypeObjectValues, Type> = { [K in keyof Obj]: Type; } /** Return true | false whenever an object has a property of type U */ type HasPropertyOfType, ExpectedType> = { [K in keyof Objectt]: Objectt[K] extends ExpectedType ? true : never; }[keyof Objectt] extends never ? false : true // https://stackoverflow.com/questions/49580725/is-it-possible-to-restrict-typescript-object-to-contain-only-properties-defined type NoExtraProperties = U & MakeObjKeysAsNever> type MakeObjKeysAsNever = { [P in K]: never } type RemoveTypeFromTuple = T extends [] ? [] : T extends TypeToRemove ? [] : T extends [infer A, ...infer R] ? [ ...RemoveTypeFromTuple, ...RemoveTypeFromTuple ] : [T] type GetTypeKeyFromObject = { [P in keyof ObjType]: ObjType[P] extends Type ? never : P; }[keyof ObjType] /** Remove object key/values that are of a certain type */ type RemoveTypeFromObj = Pick< ObjType, GetTypeKeyFromObject > /** Get keys where the key type (number, string, Symbol...) is of Type */ type GetObjectKeysThatAreOfType = { [P in keyof ObjType]: P extends Type ? P : never }[keyof ObjType] /** Remove Symbol and number from Object type */ type ForceStringKeyObject> = Pick< Obj, GetObjectKeysThatAreOfType > /** Get all indices of an array as a type. Eg: 0 | 1 | 2... */ type Indices = Exclude< Partial['length'], T['length'] > /** Remove Readonly Modifier */ type Writeable = { -readonly [P in keyof T]: T[P] } /** Remove Readonly Modifier Recursively */ type DeepWriteable = { -readonly [P in keyof T]: DeepWriteable } /** used to type generic function without having to do (...params: any) => any */ type GenericFunction = (...params: any[]) => any /** used like IsObject extends true ? .... */ type IsObject = T extends Record ? T extends GenericFunction ? false : T extends (any[] | readonly any[]) ? false : ConsiderDateAndRegexpsAsObjects extends false ? T extends (Date | RegExp) ? false : true : true : false type ReadonlyDeep = { readonly [P in keyof T]: IsObject extends true ? ReadonlyDeep : T[P]; } /** Equivalent of { myPropA: string, otherProp?: never } | { myPropA?: never, otherProp: string }. This would be written Exclusive<{ myPropA: string }, { otherProp: string }> */ type Exclusive< A extends Record, B extends Record, C extends Record = {}, D extends Record = {}, E extends Record = {} > = | ({ [P in Exclude]?: never; } & B) | ({ [P in Exclude]?: never; } & A) | ({ [P in Exclude]?: never; } & C) | ({ [P in Exclude]?: never; } & D) | ({ [P in Exclude]?: never; } & E) type WeekDays = 0 | 1 | 2 | 3 | 4 | 5 | 6 type StringAndUnion = T | (string & {}) type ArrayKeys = keyof Arr & number type PropsIntersection = (T extends any ? (x: T) => void : never) extends (x: infer R) => void ? R : never /** Giving a list of object, this will return a type similar to O1 & O2 & O3... * * It works well when with this structure ```type ObjOfObj = Record>``` * * Giving that structure, if you want to extract ```ObjOfObj[keyof ObjOfObj]``` the type may be never because its impossible to match O1 | O2... */ type MergeMultipleObjects> = PropsIntersection /** Giving a list of required fields and subfields (dot notation) this type will return the object with the required fields added to type. @example ```ts type Obj = { a: string; aOptional?: string; b: { c?: string d?: string e: string } } type RequiredFields = { aOptional: true 'b.c': true } type Result = AddRequiredFieldsToObject // PARSED TYPE: type Obj = { a: string aOptional: string // this has became required because we specified it in RequiredFields b: { c: string // ALSO did this field d?: string // this one has kept being optional e: string // " " " " required } } ``` */ type AddRequiredFieldsToObject, RequiredFields extends Record> = RemoveTypeFromObj extends true ? AddRequiredFieldsToObject : Obj[K] : never) : never : never }>, never> & RemoveTypeFromObj<{ [K in keyof Obj]: K extends string // ? Obj[K] extends any[] | readonly any[] ? Obj[K] : ? K extends keyof RequiredFields ? never : IsObject extends true ? AddRequiredFieldsToObject : Obj[K] : never }, never> /** * Removes the first element from a tuple type. * * @example * ```ts * type Example1 = RemoveFirst<[boolean, number, string]>; // [number, string] * type Example2 = RemoveFirst<[boolean, string]>; // [string] * type Example3 = RemoveFirst<[boolean]>; // [] * type Example4 = RemoveFirst<[]>; // never * ``` */ type RemoveFirstElementFromTuple = T extends [any, ...infer Rest] ? Rest : never;