質問編集履歴
6
軽微なミスの修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -244,11 +244,11 @@
|
|
244
244
|
|
245
245
|
{
|
246
246
|
|
247
|
-
[
|
247
|
+
[K in keyof O]: {
|
248
|
-
|
248
|
+
|
249
|
-
[
|
249
|
+
[L in {[M in keyof O]: keyof O[M]}[keyof O]]?: L extends keyof O[K]
|
250
|
-
|
250
|
+
|
251
|
-
? O[
|
251
|
+
? O[K][L]
|
252
252
|
|
253
253
|
: never
|
254
254
|
|
5
続・試したことのミス修正
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
|
-
[
|
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
ミスに気づいたので編集する旨を記入
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
続・試したことを追加
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
補足を追加
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
誤字修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -98,7 +98,7 @@
|
|
98
98
|
|
99
99
|
|
100
100
|
|
101
|
-
const result = (_.mapValues as MapValues
|
101
|
+
const result = (_.mapValues as MapValues<typeof obj, typeof func>)(obj, func)
|
102
102
|
|
103
103
|
```
|
104
104
|
|