Skip to content

Commit b5d874a

Browse files
committed
start getIn implementation for ObjectLikeMap
1 parent 0543432 commit b5d874a

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

type-definitions/Immutable.d.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,8 +783,33 @@ declare module Immutable {
783783
*/
784784
get<K extends keyof R>(key: K, notSetValue?: unknown): R[K];
785785
get<NSV>(key: string, notSetValue: NSV): NSV;
786+
787+
// this `getIn` implementation is not ideal.
788+
// it could be optimized See https://github.com/immutable-js/immutable-js/issues/1462#issuecomment-584123268
789+
// or https://www.typescriptlang.org/play?ts=4.3.5#code/FAFwngDgpgBA4lEBZAhhAKpKAeAygPhgF4ZcYoAPEKAOwBMBnGAeQCMArKAYxABkBLANZRUEbPxoAzKACcY6QgH55MAFykA3MBgxQWGAAkoKOtgXEVlavSYAFFDJQBbRLIbYAFADd1E6XIAlABoYADpwhwBzBnUUGjAAbQBdAEpiQjiwfG0dGGUAnJ11GigvWS09aENjOnQoBhAARgsjE2wExpCAJhCAZiT8DRgAemGYRsrYVtr6kC6WmvaBodGYErKZSeqTOobehbaAIhoAexAYOIuZRzBDwZGx9dlgLfQUfgAbM0ISdHIqWiMC7xZKFPIwDwecKhKIxeRpIgZeJpKyApjeWLxELQ2G+KSyGABBFIsBg3Lggrk8nFUrPalrWkyCrgKpvT67JoWNlfDrdPrLB4wBI9GD9V7vD4c+a-CVLe6rUEs2Dcjn7GWfbDHM7Aq43O4rR6Ml5KmAAYRONC4KBAZhCAFUfjB7I4XNQZO4wRj5NiIjJouo7f9rEDMslwYGaRticDSYNjfpzZbrRzmiRE1abQAGEK8mAi-rysYJbPjPmipJbdPJ2bSs0WjPYEta86XBx6wsMjbxqoBRkMKC9ugAVy4slthJCpsdAG8wZn1FWbehJ3HyY11L2Nv3ByOx9NsAF8CFuQej3Wk0uV3GAL4JAJBtFCpLgzNqcZJZn6TduHDmX4Pmwn3BMMNz7AcoGHUcZGwfcFGPWU4KfOMtm-d0oBTCxUP7dpOjzfkOwSXoy0aCsTSw9Ca0wsC5UFRUvzA1UqK3HBmx1NsUFuQhVieTYtgANRQD5+Doa0oHsEAAAsdyg8deBCYIWEdXgAKBYQwBOSR5DBZRZypKl50JajF2wOTFNXPTcnXGABKEkTqHEqSIN3aD0ASXgkhCfdD3gjVvPPBtTOYfBzPJW971RQCw2UV91BIsFI3KF5KAgE4ZHOE0bOE0SHNkpSVKYUFyWUQrcnUTK7LE61HMgsdl22UxeDPE9GpzZZu1gXsQBkfgygc6TasnEJlIikMQQGCxTXymA1I0+BEFETBoG+bSYF0iydAMhBkDQRbf3wBJTQ-MkqSszrut6qr+ugraFqwb4Do8+qTKa2VGpC3Jb2GgFIufaK3zi+keIqVZktS9L6K6nrKsk3KLC+4MCorVYiq05HSsMyGLskq7x33Fr5Fe4KKnJHJQbSmAyMQc7oYk2GSHhx8Sp0ZR0HijHqb6pyZLqvGXo1N6KgkN1JBQUcYAAOVmCDVrBFB1DWvTWHl469K4YohycVhEvW68tFCrRr3a+RZlTazBKy+yquwSWGggnNDhQQ4QkOVhDgFBUHadl23deSiSHK7KrZt6g6Htx3nboN2Ox4o3GJIM6oZy4O7eNhpGg7acYDVtYNa1uRDZNDkABYqMxmnral0PU7maOjSSigUvJoXZBFsW2E4HgBGEURsDBcLvqBTOEjUmAJBgBpupoSIknUIcaEEU4AHcaBgQ2dEIBWRgAKi3skt4xocZBoJhJNgLxBKHWAUAYBgTi4fhRLoGBF-4SSKYk2AIBkE4vGE6W1JCKlNYZxcCIBspfUekg97v1gOaD4HxuAgH4BaGAdATj1GAecLgFoQDvBXpJfgTA1KhD3tA8WZwoC+HOIQmAKUb78FYAgi400oBgBgE4DiMAtYXBvnfB+Idn6vwkjqAABnPOgUBJASAgiImA58PiXyCNA2+kCYAiNOCAUBIBwFQFkTQjRtDv6-wkU-OIT8CFMFdBJE4T8ZCIEPsfNR4jJHSLoCIpRVJ96SWtKg9BTADGRCHA4OI1BYCnxYWwxe19MEwEkCccRJDPHDDBJERA2AADSU0ZqaUPB4NS6h0khA0VonRihZ7zyXjQFIG4EjpKOuSVJNpxa4D4vgPJrD1ATwkJEIpICwEX0oRLFp1Shl8WJrkRpABJGg2BbBTS6VPZIbT+wOC4BJdJrCHLqFsL0zR-SFFQDKTAOeC8TjLxGQnLGtMFK2HMobF4aNsHH3OCcdQ7dEFdxEGgbAmc5YsA4B8oQXyxCZyVv8jufAgU90ztnGgudyir3uNeJFyEchkQsO8zuULvm-PVprAkyKchPIaDAGQG49a6B0CaOAABRdAAB9SZ4t6UBBpbgO0vA-jxyponK2CkEgAHIUACvGtxeFmwqX6FpQyplLK2UcoZabS5NMcYKX3IK4VAwfI8iFSK4Kgo4X4olRTKVdLGXMtZeyzl9LGisAsNkua20MB3UPIKXVaLTUyotfK61jQUAWF1Vk1hs0bo7RdUoGAgaEpMjdcKj1VRpXmrlVahltZQ3OqWoeA0q0Lh4rzqveNsBE2ystQq+lXR-UkHTbtH5fzDV52Rdm3FOcjUFuAKsBg1ihwfCftw444rDhcKHNQpgxxGSHFCE6E49DGFsK1laIc-Z2a8phgpBZkQlmkvsUfUdPFB2sGHcuq5B4cy6vGmgjBi9UqCGAMSrBFgZChCmTQDwGqRUpCAA
790+
getIn<K1 extends keyof R>(path: [K1]): R[K1];
791+
getIn<K1 extends keyof R, K2 extends keyof GetMapType<R[K1]>>(
792+
path: [K1, K2]
793+
): GetMapType<R[K1]>[K2];
794+
getIn<
795+
K1 extends keyof R,
796+
K2 extends keyof GetMapType<R[K1]>,
797+
K3 extends keyof GetMapType<GetMapType<R[K1]>[K2]>
798+
>(
799+
path: [K1, K2, K3]
800+
): GetMapType<GetMapType<R[K1]>[K2]>[K3];
801+
getIn<
802+
K1 extends keyof R,
803+
K2 extends keyof GetMapType<R[K1]>,
804+
K3 extends keyof GetMapType<GetMapType<R[K1]>[K2]>,
805+
K4 extends keyof GetMapType<GetMapType<GetMapType<R[K1]>[K2]>[K3]>
806+
>(
807+
path: [K1, K2, K3, K4]
808+
): GetMapType<GetMapType<GetMapType<R[K1]>[K2]>[K3]>[K4];
786809
}
787810

811+
type GetMapType<S> = S extends ObjectLikeMap<infer T> ? T : S;
812+
788813
export interface Map<K, V> extends Collection.Keyed<K, V> {
789814
/**
790815
* The number of entries in this Map.

type-definitions/ts-tests/map.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ import { Map, List } from 'immutable';
2424
// $ExpectType ObjectLikeMap<{ a: number; b: string; }>
2525
Map({ a: 1, b: 'b' });
2626

27+
// $ExpectType ObjectLikeMap<{ a: ObjectLikeMap<{ b: ObjectLikeMap<{ c: number; }>; }>; }>
28+
Map({ a: Map({ b: Map({ c: 3 }) }) });
29+
2730
// $ExpectError
2831
Map<{ a: string }>({ a: 1 });
2932

@@ -84,6 +87,17 @@ import { Map, List } from 'immutable';
8487
Map({ a: 4 }).get('b');
8588
}
8689

90+
{
91+
// Minimum TypeScript Version: 4.1
92+
// #getIn
93+
94+
// $ExpectType number
95+
Map({ a: 4, b: true }).getIn(['a']);
96+
97+
// $ExpectType number
98+
Map({ a: Map({ b: Map({ c: Map({ d: 4 }) }) }) }).getIn(['a', 'b', 'c', 'd']);
99+
}
100+
87101
{
88102
// #set
89103

0 commit comments

Comments
 (0)