type ObjectId = string type Env = 'test' | 'development' | 'production' | 'preprod' | 'build' | 'ci' type MaybeArray = T | T[] type MaybePromise = T | Promise 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 CountryCodeIso = `${Letters}${Letters}` type TranslationObj = { [countryIsoCode in CountryCodeIso]?: string } 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; } // 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 > type StringKeys = keyof T extends infer K ? K extends string ? K : never : never type HasPropertyOfType = { [K in keyof T]: T[K] extends U ? true : never; }[keyof T] extends never ? false : true /** 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 } type GenericFunction = (...params: any[]) => any type IsObject = T extends Record ? T extends GenericFunction ? false : 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