From be389c6cfae8aa18dc17055366247e79f9566d68 Mon Sep 17 00:00:00 2001 From: Dmytro Stanchiev Date: Tue, 7 Apr 2026 08:08:44 -0400 Subject: [PATCH] style(skills): standardize utility-types.ts formatting --- .../references/utility-types.ts | 213 +++++++++--------- 1 file changed, 106 insertions(+), 107 deletions(-) diff --git a/.claude/skills/typescript-expert/references/utility-types.ts b/.claude/skills/typescript-expert/references/utility-types.ts index bd56937..8a5accb 100644 --- a/.claude/skills/typescript-expert/references/utility-types.ts +++ b/.claude/skills/typescript-expert/references/utility-types.ts @@ -1,6 +1,6 @@ /** * TypeScript Utility Types Library - * + * * A collection of commonly used utility types for TypeScript projects. * Copy and use as needed in your projects. */ @@ -11,19 +11,19 @@ /** * Create nominal/branded types to prevent primitive obsession. - * + * * @example * type UserId = Brand * type OrderId = Brand */ -export type Brand = K & { readonly __brand: T } +export type Brand = K & { readonly __brand: T }; // Branded type constructors -export type UserId = Brand -export type Email = Brand -export type UUID = Brand -export type Timestamp = Brand -export type PositiveNumber = Brand +export type UserId = Brand; +export type Email = Brand; +export type UUID = Brand; +export type Timestamp = Brand; +export type PositiveNumber = Brand; // ============================================================================= // RESULT TYPE (Error Handling) @@ -33,33 +33,33 @@ export type PositiveNumber = Brand * Type-safe error handling without exceptions. */ export type Result = - | { success: true; data: T } - | { success: false; error: E } + | { success: true; data: T } + | { success: false; error: E }; export const ok = (data: T): Result => ({ - success: true, - data -}) + success: true, + data, +}); export const err = (error: E): Result => ({ - success: false, - error -}) + success: false, + error, +}); // ============================================================================= -// OPTION TYPE (Nullable Handling) +// OPTION TYPE (Nullable Handling) // ============================================================================= /** * Explicit optional value handling. */ -export type Option = Some | None +export type Option = Some | None; -export type Some = { type: 'some'; value: T } -export type None = { type: 'none' } +export type Some = { type: "some"; value: T }; +export type None = { type: "none" }; -export const some = (value: T): Some => ({ type: 'some', value }) -export const none: None = { type: 'none' } +export const some = (value: T): Some => ({ type: "some", value }); +export const none: None = { type: "none" }; // ============================================================================= // DEEP UTILITIES @@ -69,31 +69,31 @@ export const none: None = { type: 'none' } * Make all properties deeply readonly. */ export type DeepReadonly = T extends (...args: any[]) => any - ? T - : T extends object - ? { readonly [K in keyof T]: DeepReadonly } - : T + ? T + : T extends object + ? { readonly [K in keyof T]: DeepReadonly } + : T; /** * Make all properties deeply optional. */ export type DeepPartial = T extends object - ? { [K in keyof T]?: DeepPartial } - : T + ? { [K in keyof T]?: DeepPartial } + : T; /** * Make all properties deeply required. */ export type DeepRequired = T extends object - ? { [K in keyof T]-?: DeepRequired } - : T + ? { [K in keyof T]-?: DeepRequired } + : T; /** * Make all properties deeply mutable (remove readonly). */ export type DeepMutable = T extends object - ? { -readonly [K in keyof T]: DeepMutable } - : T + ? { -readonly [K in keyof T]: DeepMutable } + : T; // ============================================================================= // OBJECT UTILITIES @@ -103,38 +103,40 @@ export type DeepMutable = T extends object * Get keys of object where value matches type. */ export type KeysOfType = { - [K in keyof T]: T[K] extends V ? K : never -}[keyof T] + [K in keyof T]: T[K] extends V ? K : never; +}[keyof T]; /** * Pick properties by value type. */ -export type PickByType = Pick> +export type PickByType = Pick>; /** * Omit properties by value type. */ -export type OmitByType = Omit> +export type OmitByType = Omit>; /** * Make specific keys optional. */ -export type PartialBy = Omit & Partial> +export type PartialBy = Omit & Partial>; /** * Make specific keys required. */ -export type RequiredBy = Omit & Required> +export type RequiredBy = Omit & + Required>; /** * Make specific keys readonly. */ -export type ReadonlyBy = Omit & Readonly> +export type ReadonlyBy = Omit & + Readonly>; /** * Merge two types (second overrides first). */ -export type Merge = Omit & U +export type Merge = Omit & U; // ============================================================================= // ARRAY UTILITIES @@ -143,30 +145,30 @@ export type Merge = Omit & U /** * Get element type from array. */ -export type ElementOf = T extends (infer E)[] ? E : never +export type ElementOf = T extends (infer E)[] ? E : never; /** * Tuple of specific length. */ export type Tuple = N extends N - ? number extends N - ? T[] - : _TupleOf - : never + ? number extends N + ? T[] + : _TupleOf + : never; -type _TupleOf = R['length'] extends N - ? R - : _TupleOf +type _TupleOf = R["length"] extends N + ? R + : _TupleOf; /** * Non-empty array. */ -export type NonEmptyArray = [T, ...T[]] +export type NonEmptyArray = [T, ...T[]]; /** * At least N elements. */ -export type AtLeast = [...Tuple, ...T[]] +export type AtLeast = [...Tuple, ...T[]]; // ============================================================================= // FUNCTION UTILITIES @@ -175,28 +177,28 @@ export type AtLeast = [...Tuple, ...T[]] /** * Get function arguments as tuple. */ -export type Arguments = T extends (...args: infer A) => any ? A : never +export type Arguments = T extends (...args: infer A) => any ? A : never; /** * Get first argument of function. */ export type FirstArgument = T extends (first: infer F, ...args: any[]) => any - ? F - : never + ? F + : never; /** * Async version of function. */ export type AsyncFunction any> = ( - ...args: Parameters -) => Promise>> + ...args: Parameters +) => Promise>>; /** * Promisify return type. */ export type Promisify = T extends (...args: infer A) => infer R - ? (...args: A) => Promise> - : never + ? (...args: A) => Promise> + : never; // ============================================================================= // STRING UTILITIES @@ -205,31 +207,30 @@ export type Promisify = T extends (...args: infer A) => infer R /** * Split string by delimiter. */ -export type Split = - S extends `${infer T}${D}${infer U}` - ? [T, ...Split] - : [S] +export type Split< + S extends string, + D extends string, +> = S extends `${infer T}${D}${infer U}` ? [T, ...Split] : [S]; /** * Join tuple to string. */ -export type Join = - T extends [] - ? '' - : T extends [infer F extends string] - ? F - : T extends [infer F extends string, ...infer R extends string[]] - ? `${F}${D}${Join}` - : never +export type Join = T extends [] + ? "" + : T extends [infer F extends string] + ? F + : T extends [infer F extends string, ...infer R extends string[]] + ? `${F}${D}${Join}` + : never; /** * Path to nested object. */ export type PathOf = K extends string - ? T[K] extends object - ? K | `${K}.${PathOf}` - : K - : never + ? T[K] extends object + ? K | `${K}.${PathOf}` + : K + : never; // ============================================================================= // UNION UTILITIES @@ -238,27 +239,28 @@ export type PathOf = K extends string /** * Last element of union. */ -export type UnionLast = UnionToIntersection< - T extends any ? () => T : never -> extends () => infer R - ? R - : never +export type UnionLast = + UnionToIntersection T : never> extends () => infer R + ? R + : never; /** * Union to intersection. */ export type UnionToIntersection = ( - U extends any ? (k: U) => void : never + U extends any + ? (k: U) => void + : never ) extends (k: infer I) => void - ? I - : never + ? I + : never; /** * Union to tuple. */ export type UnionToTuple> = [T] extends [never] - ? [] - : [...UnionToTuple>, L] + ? [] + : [...UnionToTuple>, L]; // ============================================================================= // VALIDATION UTILITIES @@ -268,28 +270,25 @@ export type UnionToTuple> = [T] extends [never] * Assert type at compile time. */ export type AssertEqual = - (() => V extends T ? 1 : 2) extends (() => V extends U ? 1 : 2) - ? true - : false + (() => V extends T ? 1 : 2) extends () => V extends U ? 1 : 2 + ? true + : false; /** * Ensure type is not never. */ -export type IsNever = [T] extends [never] ? true : false +export type IsNever = [T] extends [never] ? true : false; /** * Ensure type is any. */ -export type IsAny = 0 extends 1 & T ? true : false +export type IsAny = 0 extends 1 & T ? true : false; /** * Ensure type is unknown. */ -export type IsUnknown = IsAny extends true - ? false - : unknown extends T - ? true - : false +export type IsUnknown = + IsAny extends true ? false : unknown extends T ? true : false; // ============================================================================= // JSON UTILITIES @@ -298,23 +297,23 @@ export type IsUnknown = IsAny extends true /** * JSON-safe types. */ -export type JsonPrimitive = string | number | boolean | null -export type JsonArray = JsonValue[] -export type JsonObject = { [key: string]: JsonValue } -export type JsonValue = JsonPrimitive | JsonArray | JsonObject +export type JsonPrimitive = string | number | boolean | null; +export type JsonArray = JsonValue[]; +export type JsonObject = { [key: string]: JsonValue }; +export type JsonValue = JsonPrimitive | JsonArray | JsonObject; /** * Make type JSON-serializable. */ export type Jsonify = T extends JsonPrimitive - ? T - : T extends undefined | ((...args: any[]) => any) | symbol - ? never - : T extends { toJSON(): infer R } - ? R - : T extends object - ? { [K in keyof T]: Jsonify } - : never + ? T + : T extends undefined | ((...args: any[]) => any) | symbol + ? never + : T extends { toJSON(): infer R } + ? R + : T extends object + ? { [K in keyof T]: Jsonify } + : never; // ============================================================================= // EXHAUSTIVE CHECK @@ -324,12 +323,12 @@ export type Jsonify = T extends JsonPrimitive * Ensure all cases are handled in switch/if. */ export function assertNever(value: never, message?: string): never { - throw new Error(message ?? `Unexpected value: ${value}`) + throw new Error(message ?? `Unexpected value: ${value}`); } /** * Exhaustive check without throwing. */ export function exhaustiveCheck(_value: never): void { - // This function should never be called + // This function should never be called }