/** * @file Common Type Utilities * @description Shared type definitions and type helpers * * This module provides common utility types. Many core types are now * centralized in shared/type-utils.ts - prefer importing from there. */ export type { Result } from '../shared/type-utils'; export { ok, err, isOk, isErr } from '../shared/type-utils'; /** * Make all properties required recursively */ export type DeepRequired = T extends object ? { [P in keyof T]-?: DeepRequired; } : T; /** * Make all properties readonly recursively */ export type DeepReadonly = T extends object ? { readonly [P in keyof T]: DeepReadonly; } : T; /** * Make specific keys optional */ export type PartialBy = Omit & Partial>; /** * Make specific keys required */ export type RequiredBy = Omit & Required>; /** * Extract keys of a certain type */ export type KeysOfType = { [K in keyof T]: T[K] extends U ? K : never; }[keyof T]; /** * Omit keys of a certain type */ export type OmitByType = Pick; /** * Pick keys of a certain type */ export type PickByType = Pick>; /** * Nullable type */ export type Nullable = T | null; /** * Maybe type (null or undefined) */ export type Maybe = T | null | undefined; /** * Non-nullable nested type */ export type NonNullableDeep = T extends object ? { [K in keyof T]: NonNullableDeep>; } : NonNullable; /** * Union to intersection */ export type UnionToIntersection = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never; /** * String literal type */ export type StringLiteral = T extends string ? string extends T ? never : T : never; /** * Branded type for nominal typing */ export type Brand = T & { readonly __brand: B; }; /** * ID type */ export type Id = Brand; /** * Create branded type helper */ export declare function brand(value: T): Brand; /** * Unwrap Promise type */ export type Awaited = T extends Promise ? Awaited : T; /** * Function type */ export type Fn = (...args: Args) => Return; /** * Async function type */ export type AsyncFn = (...args: Args) => Promise; /** * Class constructor type */ export type Constructor = new (...args: unknown[]) => T; /** * Get return type of constructor */ export type InstanceOf = T extends Constructor ? I : never; /** * Tuple type */ export type Tuple = N extends N ? number extends N ? T[] : TupleOfHelper : never; type TupleOfHelper = R['length'] extends N ? R : TupleOfHelper; /** * Record with string keys */ export type Dictionary = Record; /** * Entries type */ export type Entries = [keyof T, T[keyof T]][]; /** * Values type */ export type ValueOf = T[keyof T]; /** * Flatten type */ export type Flatten = T extends (infer U)[] ? U : T; /** * Element type of array */ export type ElementOf = T extends readonly (infer E)[] ? E : never; /** * Path keys of nested object */ export type PathKeys = [D] extends [never] ? never : T extends object ? { [K in keyof T]-?: K extends string | number ? `${K}` | `${K}.${PathKeys}` : never; }[keyof T] : never; type Prev = [never, 0, 1, 2, 3, 4, ...0[]]; /** * Make all properties optional recursively */ export type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial; } : T; /** * Mutable type (remove readonly) */ export type Mutable = { -readonly [P in keyof T]: T[P]; }; /** * Deep mutable type */ export type DeepMutable = { -readonly [P in keyof T]: T[P] extends object ? DeepMutable : T[P]; }; /** * Exact type (no excess properties) */ export type Exact = T extends Shape ? Exclude extends never ? T : never : never; /** * JSON-serializable type */ export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue; }; /** * JSON object type */ export type JsonObject = { [key: string]: JsonValue; }; /** * Error with code */ export interface CodedError extends Error { code: string; }