質問編集履歴
6
軽微なミスの修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -121,9 +121,9 @@
|
|
121
121
|
}[keyof O]]: O[K][L]
|
122
122
|
} &
|
123
123
|
{
|
124
|
-
[
|
124
|
+
[K in keyof O]: {
|
125
|
-
[
|
125
|
+
[L in {[M in keyof O]: keyof O[M]}[keyof O]]?: L extends keyof O[K]
|
126
|
-
? O[
|
126
|
+
? O[K][L]
|
127
127
|
: never
|
128
128
|
}
|
129
129
|
}[keyof O]
|
5
続・試したことのミス修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -110,14 +110,23 @@
|
|
110
110
|
###補足
|
111
111
|
`_.mapValues`のcallbackは(value, key, object)の3引数を持ちますが、上記はとりあえずvalueだけ用いて試行錯誤した結果です。最終的にはすべて使えるのが目標です。
|
112
112
|
|
113
|
-
###
|
113
|
+
###続・試したこと(ミス修正しました)
|
114
114
|
完全な解決ではありませんが、実用上そこそこいい感じになったものを追記します。
|
115
115
|
|
116
116
|
```typescript
|
117
117
|
type ObjValue<O> = {
|
118
118
|
[K in keyof O]: {
|
119
|
+
[L in keyof {
|
120
|
+
[K in keyof O]: {[M in keyof O[keyof O]]: O[K][M]}
|
119
|
-
[
|
121
|
+
}[keyof O]]: O[K][L]
|
122
|
+
} &
|
123
|
+
{
|
124
|
+
[L in keyof O]: {
|
125
|
+
[M in {[N in keyof O]: keyof O[N]}[keyof O]]?: M extends keyof O[L]
|
126
|
+
? O[L][M]
|
127
|
+
: never
|
120
|
-
|
128
|
+
}
|
129
|
+
}[keyof O]
|
121
130
|
}[keyof O]
|
122
131
|
|
123
132
|
const func = <T extends ObjValue<typeof obj>>(arg: T) => ({
|
4
ミスに気づいたので編集する旨を記入
title
CHANGED
File without changes
|
body
CHANGED
@@ -110,7 +110,7 @@
|
|
110
110
|
###補足
|
111
111
|
`_.mapValues`のcallbackは(value, key, object)の3引数を持ちますが、上記はとりあえずvalueだけ用いて試行錯誤した結果です。最終的にはすべて使えるのが目標です。
|
112
112
|
|
113
|
-
###続・試したこと
|
113
|
+
###~~続・試したこと~~(ミスってます、編集します)
|
114
114
|
完全な解決ではありませんが、実用上そこそこいい感じになったものを追記します。
|
115
115
|
|
116
116
|
```typescript
|
3
続・試したことを追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -108,4 +108,39 @@
|
|
108
108
|
mapValuesについてググってみると、同様の悩みを持っている人は多いようで、やはり難しそうではありますが、ご回答をよろしくお願いいたします。
|
109
109
|
|
110
110
|
###補足
|
111
|
-
`_.mapValues`のcallbackは(value, key, object)の3引数を持ちますが、上記はとりあえずvalueだけ用いて試行錯誤した結果です。最終的にはすべて使えるのが目標です。
|
111
|
+
`_.mapValues`のcallbackは(value, key, object)の3引数を持ちますが、上記はとりあえずvalueだけ用いて試行錯誤した結果です。最終的にはすべて使えるのが目標です。
|
112
|
+
|
113
|
+
###続・試したこと
|
114
|
+
完全な解決ではありませんが、実用上そこそこいい感じになったものを追記します。
|
115
|
+
|
116
|
+
```typescript
|
117
|
+
type ObjValue<O> = {
|
118
|
+
[K in keyof O]: {
|
119
|
+
[L in keyof O[K]]: O[K][L]
|
120
|
+
}
|
121
|
+
}[keyof O]
|
122
|
+
|
123
|
+
const func = <T extends ObjValue<typeof obj>>(arg: T) => ({
|
124
|
+
x1: {...arg, b4: 'c'},
|
125
|
+
x2: 1
|
126
|
+
})
|
127
|
+
|
128
|
+
type MapValues<O, F> = {
|
129
|
+
(obj: O, func: F): {
|
130
|
+
[K in keyof O]: F extends {(n1: O[K]): infer R} ? R : never
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
const result = (_.mapValues as MapValues<typeof obj, typeof func>)(obj, func)
|
135
|
+
```
|
136
|
+
|
137
|
+
こうすると、`ObjValue<typeof obj>`が`{b1: number; b2?: string; b3?: number}`となり、`typeof result`は下記のようになります。
|
138
|
+
```typescript
|
139
|
+
{
|
140
|
+
a1: {x1: {b1: number; b2?: string; b3?: number; b4: string}; x2: number};
|
141
|
+
a2: {x1: {b1: number; b2?: string; b3?: number; b4: string}; x2: number};
|
142
|
+
}
|
143
|
+
```
|
144
|
+
本来の目標から見ると、型の情報はけっこう抜け落ちてしまっているものの、インテリセンスは実用上役に立つレベルで効きますので、最悪、本質的な解決ができないならこんな感じで行こうと思います。
|
145
|
+
|
146
|
+
とはいえ、やっぱり本質的な解決が望ましいので、まだまだ回答をお待ちしています。
|
2
補足を追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -105,4 +105,7 @@
|
|
105
105
|
1. (上)`FuncType`を毎回定義してくても、`typeof func`から`FuncType<T>`を生成できる、……ような感じのことをする。
|
106
106
|
1. (中)`FuncType<T>`は毎回書くことにするが、`type MapValues`は毎回定義しなくても、`FuncType`を型引数にして生成できる、……ような感じのことをする。
|
107
107
|
|
108
|
-
mapValuesについてググってみると、同様の悩みを持っている人は多いようで、やはり難しそうではありますが、ご回答をよろしくお願いいたします。
|
108
|
+
mapValuesについてググってみると、同様の悩みを持っている人は多いようで、やはり難しそうではありますが、ご回答をよろしくお願いいたします。
|
109
|
+
|
110
|
+
###補足
|
111
|
+
`_.mapValues`のcallbackは(value, key, object)の3引数を持ちますが、上記はとりあえずvalueだけ用いて試行錯誤した結果です。最終的にはすべて使えるのが目標です。
|
1
誤字修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -48,7 +48,7 @@
|
|
48
48
|
}
|
49
49
|
}
|
50
50
|
|
51
|
-
const result = (_.mapValues as
|
51
|
+
const result = (_.mapValues as MapValues<typeof obj, typeof func>)(obj, func)
|
52
52
|
```
|
53
53
|
|
54
54
|
しかし、このときの`typeof result`は
|