declare namespace Immutable { type DeepImmutable<T> = T extends (infer R)[] ? DeepImmutableList<R> : T extends object ? DeepImmutableMap<T> : T; interface DeepImmutableMap<T> { get<K extends keyof T>(key: K): DeepImmutable<T[K]>; } interface DeepImmutableList<T> { get(idx: number): DeepImmutable<T>; } export function fromJS<T>(source: T): DeepImmutable<T>; export function toJS<T>(obj: DeepImmutable<T>): T; }