|
1 | 1 | import { Placeholder } from './util/tools'; |
2 | 2 |
|
3 | 3 | // 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) |
6 | 6 | <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>; |
13 | 8 | } |
14 | 9 |
|
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>; |
21 | 13 | } |
22 | | - // assoc(prop)(__, obj) when prop is not keyof obj |
23 | | - <U>(__: Placeholder, obj: U): <T>(val: T) => U & Record<K, T>; |
24 | 14 |
|
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>; |
29 | 17 | }; |
30 | 18 |
|
31 | 19 | // assoc(__, val) |
32 | 20 | 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>; |
39 | 24 | } |
40 | 25 |
|
41 | | - // assoc(__, val)(__, obj) |
| 26 | + // assoc(__, val)(__, obj)(prop) |
42 | 27 | <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>; |
47 | 29 | }; |
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>; |
52 | 33 | }; |
53 | 34 |
|
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>; |
60 | 38 | }; |
61 | 39 |
|
62 | 40 | // assoc(__, __, obj) |
63 | 41 | 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>; |
70 | 45 | } |
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) |
74 | 47 | <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>; |
79 | 49 | } |
80 | 50 | // 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>; |
84 | 52 | }; |
85 | 53 |
|
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