gameplate - v2.2.0
    Preparing search index...

    Type Alias DeepReadonly<T>

    DeepReadonly: T extends (...args: never[]) => unknown
        ? T
        : T extends readonly (infer U)[]
            ? readonly DeepReadonly<U>[]
            : T extends ReadonlyMap<infer K, infer V>
                ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>>
                : T extends ReadonlySet<infer U>
                    ? ReadonlySet<DeepReadonly<U>>
                    : T extends object ? { readonly [K in keyof T]: DeepReadonly<T[K]> } : T

    Recursively make every property of T readonly.

    Used to make state passed into actions/selectors uneditable at compile time, so s.player.x = 10 is a TypeScript error and consumers are nudged toward immutable updates.

    Functions, arrays, maps, sets, and primitives are handled.

    Type Parameters

    • T
    type State = { player: { x: number; y: number } };
    type Readonly = DeepReadonly<State>;
    // ^? { readonly player: { readonly x: number; readonly y: number } }