aboutsummaryrefslogtreecommitdiff
path: root/utils/types/deep-readonly.ts
diff options
context:
space:
mode:
Diffstat (limited to 'utils/types/deep-readonly.ts')
-rw-r--r--utils/types/deep-readonly.ts10
1 files changed, 10 insertions, 0 deletions
diff --git a/utils/types/deep-readonly.ts b/utils/types/deep-readonly.ts
new file mode 100644
index 0000000..dddb6d6
--- /dev/null
+++ b/utils/types/deep-readonly.ts
@@ -0,0 +1,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