質問編集履歴

6

軽微なミスの修正

2019/01/05 04:55

投稿

7Kreuz
7Kreuz

スコア112

test CHANGED
File without changes
test CHANGED
@@ -244,11 +244,11 @@
244
244
 
245
245
  {
246
246
 
247
- [L in keyof O]: {
247
+ [K in keyof O]: {
248
-
248
+
249
- [M in {[N in keyof O]: keyof O[N]}[keyof O]]?: M extends keyof O[L]
249
+ [L in {[M in keyof O]: keyof O[M]}[keyof O]]?: L extends keyof O[K]
250
-
250
+
251
- ? O[L][M]
251
+ ? O[K][L]
252
252
 
253
253
  : never
254
254
 

5

続・試したことのミス修正

2019/01/05 04:55

投稿

7Kreuz
7Kreuz

スコア112

test CHANGED
File without changes
test CHANGED
@@ -222,7 +222,7 @@
222
222
 
223
223
 
224
224
 
225
- ###~~続・試したこと~~(ミスってす、編集ます
225
+ ###続・試したこと(ミス修正しまし
226
226
 
227
227
  完全な解決ではありませんが、実用上そこそこいい感じになったものを追記します。
228
228
 
@@ -234,32 +234,50 @@
234
234
 
235
235
  [K in keyof O]: {
236
236
 
237
+ [L in keyof {
238
+
239
+ [K in keyof O]: {[M in keyof O[keyof O]]: O[K][M]}
240
+
237
- [L in keyof O[K]]: O[K][L]
241
+ }[keyof O]]: O[K][L]
242
+
243
+ } &
244
+
245
+ {
246
+
247
+ [L in keyof O]: {
248
+
249
+ [M in {[N in keyof O]: keyof O[N]}[keyof O]]?: M extends keyof O[L]
250
+
251
+ ? O[L][M]
252
+
253
+ : never
254
+
255
+ }
256
+
257
+ }[keyof O]
258
+
259
+ }[keyof O]
260
+
261
+
262
+
263
+ const func = <T extends ObjValue<typeof obj>>(arg: T) => ({
264
+
265
+ x1: {...arg, b4: 'c'},
266
+
267
+ x2: 1
268
+
269
+ })
270
+
271
+
272
+
273
+ type MapValues<O, F> = {
274
+
275
+ (obj: O, func: F): {
276
+
277
+ [K in keyof O]: F extends {(n1: O[K]): infer R} ? R : never
238
278
 
239
279
  }
240
280
 
241
- }[keyof O]
242
-
243
-
244
-
245
- const func = <T extends ObjValue<typeof obj>>(arg: T) => ({
246
-
247
- x1: {...arg, b4: 'c'},
248
-
249
- x2: 1
250
-
251
- })
252
-
253
-
254
-
255
- type MapValues<O, F> = {
256
-
257
- (obj: O, func: F): {
258
-
259
- [K in keyof O]: F extends {(n1: O[K]): infer R} ? R : never
260
-
261
- }
262
-
263
281
  }
264
282
 
265
283
 

4

ミスに気づいたので編集する旨を記入

2019/01/05 04:38

投稿

7Kreuz
7Kreuz

スコア112

test CHANGED
File without changes
test CHANGED
@@ -222,7 +222,7 @@
222
222
 
223
223
 
224
224
 
225
- ###続・試したこと
225
+ ###~~続・試したこと~~(ミスってます、編集します)
226
226
 
227
227
  完全な解決ではありませんが、実用上そこそこいい感じになったものを追記します。
228
228
 

3

続・試したことを追加

2018/12/29 04:07

投稿

7Kreuz
7Kreuz

スコア112

test CHANGED
File without changes
test CHANGED
@@ -219,3 +219,73 @@
219
219
  ###補足
220
220
 
221
221
  `_.mapValues`のcallbackは(value, key, object)の3引数を持ちますが、上記はとりあえずvalueだけ用いて試行錯誤した結果です。最終的にはすべて使えるのが目標です。
222
+
223
+
224
+
225
+ ###続・試したこと
226
+
227
+ 完全な解決ではありませんが、実用上そこそこいい感じになったものを追記します。
228
+
229
+
230
+
231
+ ```typescript
232
+
233
+ type ObjValue<O> = {
234
+
235
+ [K in keyof O]: {
236
+
237
+ [L in keyof O[K]]: O[K][L]
238
+
239
+ }
240
+
241
+ }[keyof O]
242
+
243
+
244
+
245
+ const func = <T extends ObjValue<typeof obj>>(arg: T) => ({
246
+
247
+ x1: {...arg, b4: 'c'},
248
+
249
+ x2: 1
250
+
251
+ })
252
+
253
+
254
+
255
+ type MapValues<O, F> = {
256
+
257
+ (obj: O, func: F): {
258
+
259
+ [K in keyof O]: F extends {(n1: O[K]): infer R} ? R : never
260
+
261
+ }
262
+
263
+ }
264
+
265
+
266
+
267
+ const result = (_.mapValues as MapValues<typeof obj, typeof func>)(obj, func)
268
+
269
+ ```
270
+
271
+
272
+
273
+ こうすると、`ObjValue<typeof obj>`が`{b1: number; b2?: string; b3?: number}`となり、`typeof result`は下記のようになります。
274
+
275
+ ```typescript
276
+
277
+ {
278
+
279
+ a1: {x1: {b1: number; b2?: string; b3?: number; b4: string}; x2: number};
280
+
281
+ a2: {x1: {b1: number; b2?: string; b3?: number; b4: string}; x2: number};
282
+
283
+ }
284
+
285
+ ```
286
+
287
+ 本来の目標から見ると、型の情報はけっこう抜け落ちてしまっているものの、インテリセンスは実用上役に立つレベルで効きますので、最悪、本質的な解決ができないならこんな感じで行こうと思います。
288
+
289
+
290
+
291
+ とはいえ、やっぱり本質的な解決が望ましいので、まだまだ回答をお待ちしています。

2

補足を追加

2018/12/29 02:05

投稿

7Kreuz
7Kreuz

スコア112

test CHANGED
File without changes
test CHANGED
@@ -213,3 +213,9 @@
213
213
 
214
214
 
215
215
  mapValuesについてググってみると、同様の悩みを持っている人は多いようで、やはり難しそうではありますが、ご回答をよろしくお願いいたします。
216
+
217
+
218
+
219
+ ###補足
220
+
221
+ `_.mapValues`のcallbackは(value, key, object)の3引数を持ちますが、上記はとりあえずvalueだけ用いて試行錯誤した結果です。最終的にはすべて使えるのが目標です。

1

誤字修正

2018/12/28 05:06

投稿

7Kreuz
7Kreuz

スコア112

test CHANGED
File without changes
test CHANGED
@@ -98,7 +98,7 @@
98
98
 
99
99
 
100
100
 
101
- const result = (_.mapValues as MapValues2<typeof obj, typeof func>)(obj, func)
101
+ const result = (_.mapValues as MapValues<typeof obj, typeof func>)(obj, func)
102
102
 
103
103
  ```
104
104