Skip to content

Commit 7c425ad

Browse files
committed
simplify assoc typings
1 parent f6b89e2 commit 7c425ad

File tree

1 file changed

+33
-69
lines changed

1 file changed

+33
-69
lines changed

types/assoc.d.ts

Lines changed: 33 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,61 @@
11
import { Placeholder } from './util/tools';
22

33
// assoc(prop)
4-
export function assoc<K extends string>(prop: K): {
5-
// assoc(prop)(val)
4+
export function assoc<K extends PropertyKey>(prop: K): {
5+
// assoc(prop)(val)(obj)
66
<T>(val: T): {
7-
// assoc(prop)(val)(obj) when obj has key prop and val is typeof obj[prop]
8-
<U extends Record<K, T>>(obj: U): U;
9-
// assoc(prop)(val)(obj) when obj has key prop and val is not typeof obj[prop]
10-
<U extends Record<K, any>>(obj: U): Record<K, T> & Omit<U, K>;
11-
// assoc(prop)(val)(obj) when obj does not have key prop
12-
<U>(obj: U): U & Record<K, T>;
7+
<U>(obj: U): K extends keyof U ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
138
}
149

15-
// assoc(prop)(__, obj) when prop is keyof obj
16-
<U extends Record<K, any>>(__: Placeholder, obj: U): {
17-
// assoc(prop)(__, obj)(val) if val is typeof obj[prop]
18-
<T extends U[K]>(val: T): U;
19-
// assoc(prop)(__, obj)(val) if val is not typeof obj[prop]
20-
<T>(val: T): Record<K, T> & Omit<U, K>;
10+
// assoc(prop)(__, obj)(val)
11+
<U>(__: Placeholder, obj: U): {
12+
<T>(val: T): K extends keyof U ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
2113
}
22-
// assoc(prop)(__, obj) when prop is not keyof obj
23-
<U>(__: Placeholder, obj: U): <T>(val: T) => U & Record<K, T>;
2414

25-
// assoc(prop)(val, obj) when obj has key prop, tests if val is typeof obj[prop] for best return type
26-
<T, U extends Record<K, any>>(val: T, obj: U): U[K] extends T ? U : Record<K, T> & Omit<U, K>;
27-
// assoc(prop)(val, obj) when obj does not have a key prop
28-
<T, U>(val: T, obj: U): U & Record<K, T>;
15+
// assoc(prop)(val, obj)
16+
<T, U>(val: T, obj: U): K extends keyof U ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
2917
};
3018

3119
// assoc(__, val)
3220
export function assoc<T>(__: Placeholder, val: T) : {
33-
// assoc(__, val)(prop)
34-
<K extends string>(prop: K): {
35-
// assoc(__, val)(prop)(obj) when obj has key prop, tests if val is typeof obj[prop] for best return type
36-
<U extends Record<K, any>>(obj: U): U[K] extends T ? U : Record<K, T> & Omit<U, K>;
37-
// assoc(__, val)(prop)(obj) when obj does not have key prop
38-
<U>(obj: U): U & Record<K, T>;
21+
// assoc(__, val)(prop)(obj)
22+
<K extends PropertyKey>(prop: K): {
23+
<U>(obj: U): K extends keyof U ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
3924
}
4025

41-
// assoc(__, val)(__, obj)
26+
// assoc(__, val)(__, obj)(prop)
4227
<U>(__2: Placeholder, obj: U): {
43-
// assoc(__, val)(__, obj)(prop), prop is keyof obj, tests if val is typeof obj[prop] for best return type
44-
<K extends keyof U>(prop: K): U[K] extends T ? U : Record<K, T> & Omit<U, K>;
45-
// assoc(__, val)(__, obj)(prop), prop is not keyof obj
46-
<K extends string>(prop: K): U & Record<K, T>;
28+
<K extends PropertyKey>(prop: K): K extends keyof U ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
4729
};
48-
// assoc(__, val)(prop, obj), when obj has key prop, tests if val is typeof obj[prop] for best return type
49-
<K extends keyof U, U>(prop: K, obj: U): U[K] extends T ? U : Record<K, T> & Omit<U, K>;
50-
// assoc(__, val)(prop, obj), when obj does not have key prop
51-
<K extends string, U>(prop: K, obj: U): U & Record<K, T>;
30+
31+
// assoc(__, val)(prop, obj)
32+
<K extends PropertyKey, U>(prop: K, obj: U): K extends keyof U ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
5233
};
5334

54-
// assoc(prop, val)
55-
export function assoc<T, K extends string>(prop: K, val: T) : {
56-
// assoc(prop, val)(obj), when obj has key prop, tests if val is typeof obj[prop] for best return type
57-
<U extends Record<K, any>>(obj: U): U[K] extends T ? U : Record<K, T> & Omit<U, K>;
58-
// assoc(prop, val)(obj), when obj does not have key prop
59-
<U>(obj: U): U & Record<K, T>;
35+
// assoc(prop, val)(obj)
36+
export function assoc<T, K extends PropertyKey>(prop: K, val: T): {
37+
<U>(obj: U): U extends Record<K, any> ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
6038
};
6139

6240
// assoc(__, __, obj)
6341
export function assoc<U>(__: Placeholder, __2: Placeholder, obj: U): {
64-
// assoc(__, __, obj)(key)
65-
<K extends keyof U>(key: K): {
66-
// assoc(__, __, obj)(key)(value), when K is keyof U and value types match
67-
<T extends U[K]>(val: T): U;
68-
// assoc(__, __, obj)(key)(value), when K is keyof U and value types do not match
69-
<T>(val: T): Record<K, T> & Omit<U, K>
42+
// assoc(__, __, obj)(key)(val)
43+
<K extends PropertyKey>(key: K): {
44+
<T>(val: T): K extends keyof U ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
7045
}
71-
// assoc(__, __, obj)(key)(value), when K is not keyof U
72-
<K extends string>(key: K): <T>(val: T) => U & Record<K, T>;
73-
// assoc(__, __, obj)(__, value)
46+
// assoc(__, __, obj)(__, value)(key)
7447
<T>(__: Placeholder, val: T): {
75-
// assoc(__, __, obj)(__, value)(key), when obj has key prop, tests if val is typeof obj[prop] for best return type
76-
<K extends keyof U>(key: K): U[K] extends T ? U : Record<K, T> & Omit<U, K>;
77-
// assoc(__, __, obj)(__, value)(key) when obj does not have key prop
78-
<K extends string>(key: K): U & Record<K, T>;
48+
<K extends PropertyKey>(key: K): K extends keyof U ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
7949
}
8050
// assoc(__, __, obj)(key, value)
81-
<K extends keyof U>(key: K, val: U[K]): U;
82-
<K extends keyof U, T>(key: K, val: T): Record<K, T> & Omit<U, K>;
83-
<K extends string, T>(key: K, val: T): U & Record<K, T>;
51+
<K extends PropertyKey, T>(key: K, val: T): K extends keyof U ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
8452
};
8553

86-
// assoc(__, val, obj)(prop), this tests if prop is keyof obj and if val is typeof obj[prop] for best return type
87-
export function assoc<T, U>(__: Placeholder, val: T, obj: U): <K extends string>(prop: K) => K extends keyof U ? T extends U[K] ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
88-
// assoc(prop, __, obj)(val), when K is keyof obj, tests if val is typeof obj[prop] for best return type
89-
export function assoc<U, K extends keyof U>(prop: K, __: Placeholder, obj: U): <T>(val: T) => T extends U[K] ? U : Record<K, T> & Omit<U, K>;
90-
// assoc(prop, __, obj)(val), when prop is not keyof obj
91-
export function assoc<U, K extends string>(prop: K, __: Placeholder, obj: U): <T>(val: T) => U & Record<K, T>;
92-
// assoc(prop, val, obj) when prop is keyof obj and val is same type
93-
export function assoc<K extends keyof U, U>(prop: K, val: U[K], obj: U): U;
94-
// assoc(prop, val, obj) when prop is keyof obj and val is not same type
95-
export function assoc<T, K extends keyof U, U>(prop: K, val: T, obj: U): Record<K, T> & Omit<U, K>;
96-
// assoc(prop, val, obj) when prop is not keyof obj
97-
export function assoc<T, U, K extends string>(prop: K, val: T, obj: U): U & Record<K, T>;
54+
// assoc(__, val, obj)(prop)
55+
export function assoc<T, U>(__: Placeholder, val: T, obj: U): <K extends PropertyKey>(prop: K) => K extends keyof U ? T extends U[K] ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
56+
57+
// assoc(prop, __, obj)(val)
58+
export function assoc<U, K extends PropertyKey>(prop: K, __: Placeholder, obj: U): <T>(val: T) => K extends keyof U ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;
59+
60+
// assoc(prop, val, obj)
61+
export function assoc<T, U, K extends PropertyKey>(prop: K, val: T, obj: U): K extends keyof U ? U[K] extends T ? U : Record<K, T> & Omit<U, K> : U & Record<K, T>;

0 commit comments

Comments
 (0)