Skip to content

Instantly share code, notes, and snippets.

@fostyfost
Created May 8, 2020 13:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fostyfost/99433bece69d5f6f51ff24b6b52e635b to your computer and use it in GitHub Desktop.
Save fostyfost/99433bece69d5f6f51ff24b6b52e635b to your computer and use it in GitHub Desktop.
Immutable.js ImmutableFrom TS helper
import { Map } from 'immutable';
type ExpectedPrimitive = boolean | number | string | symbol | null;
/**
* Generic конвертор неиммутабельного интерфейса в иммутабельный.
* В отличие от RecordOf вычисляет return type для getIn и вложенных полей.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export interface ImmutableFrom<Interface> extends Map<string, any> {
toJS(): Interface;
get<K extends keyof Interface, D>(
key: K,
defaultValue?: D,
): Interface[K] extends object
? ImmutableFrom<Interface[K]>
: Interface[K] extends ExpectedPrimitive
? Interface[K]
: D;
getIn<TKey1 extends keyof Interface, TKey2 extends keyof Interface[TKey1], D>(
path: [TKey1, TKey2],
defaultValue?: D,
): Interface[TKey1][TKey2] extends object
? ImmutableFrom<Interface[TKey1][TKey2]>
: Interface[TKey1][TKey2] extends ExpectedPrimitive
? Interface[TKey1][TKey2]
: never;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment