aboutsummaryrefslogtreecommitdiff
path: root/utils/types/deep-readonly.ts
blob: dddb6d627bc9427e5b5db3edf8d9802da8c662ea (plain)
1
2
3
4
5
6
7
8
9
10
/** Deep-readonly version of a structural type. */
export type DeepReadonly<T> = T extends (infer U)[]
  ? ReadonlyArray<DeepReadonly<U>>
  : T extends Map<infer K, infer V>
    ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>>
    : T extends Set<infer U>
      ? ReadonlySet<DeepReadonly<U>>
      : T extends object
        ? { readonly [K in keyof T]: DeepReadonly<T[K]> }
        : T