Immutable<T>: T extends ((...args: any[]) => any)
    ? T
    : T extends number
        ? T
        : T extends bigint
            ? T
            : T extends object
                ? {
                    readonly [K in keyof T]: Immutable<T[K]>
                }
                : T

Make a type immutable.

TODO - might need to extend depending type (e.g. doesn't handle Maps, Sets or Promises yet)

Good reference implementation here:

https://github.com/ts-essentials/ts-essentials/blob/master/lib/deep-readonly/index.ts

Type Parameters

  • T