/** * Perfect Reactivity - Utility Types * * Helper types for better TypeScript integration and DX. */ import type { IComputed } from "./computed"; import type { IEffect } from "./effect"; import type { ISignal } from "./signal"; /** * Extract the value type from a signal * * @example * ```ts * const count = signal(0); * type CountType = SignalValue; // number * ``` */ export type SignalValue = S extends ISignal ? T : never; /** * Extract the value type from a computed * * @example * ```ts * const double = computed(() => 42); * type DoubleType = ComputedValue; // number * ``` */ export type ComputedValue = C extends IComputed ? T : never; /** * Union type of all reactive primitives */ export type Reactive = ISignal | IComputed; /** * Type guard to check if value is a signal * * @example * ```ts * if (isSignal(value)) { * value.write(42); * } * ``` */ export declare function isSignal(value: any): value is ISignal; /** * Type guard to check if value is a computed * * @example * ```ts * if (isComputed(value)) { * const result = value.read(); * } * ``` */ export declare function isComputed(value: any): value is IComputed; /** * Type guard to check if value is an effect * * @example * ```ts * if (isEffect(value)) { * value.dispose(); * } * ``` */ export declare function isEffect(value: any): value is IEffect; /** * Extract value from reactive or return as-is * * @example * ```ts * type T1 = Unwrap>; // number * type T2 = Unwrap; // string * ``` */ export type Unwrap = T extends Reactive ? U : T; /** * Make all properties of an object reactive * * @example * ```ts * type User = { name: string; age: number }; * type ReactiveUser = ReactiveObject; * // { name: ISignal; age: ISignal } * ``` */ export type ReactiveObject = { [K in keyof T]: ISignal; }; /** * Helper to create reactive object from plain object * * @example * ```ts * const user = reactiveObject({ * name: 'Alice', * age: 25 * }); * user.name.write('Bob'); * ``` */ export declare function reactiveObject>(obj: T): ReactiveObject; /** * Readonly signal - can only be read, not written * * @example * ```ts * function useCount() { * const count = signal(0); * const increment = () => count.write(count.read() + 1); * * return { * count: count as ReadonlySignal, * increment * }; * } * ``` */ export type ReadonlySignal = Omit, "write">; /** * Readonly computed (already read-only by nature) */ export type ReadonlyComputed = IComputed;