teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

軽微なミスの修正

2019/01/05 04:55

投稿

7Kreuz
7Kreuz

スコア112

title CHANGED
File without changes
body CHANGED
@@ -121,9 +121,9 @@
121
121
  }[keyof O]]: O[K][L]
122
122
  } &
123
123
  {
124
- [L in keyof O]: {
124
+ [K in keyof O]: {
125
- [M in {[N in keyof O]: keyof O[N]}[keyof O]]?: M extends keyof O[L]
125
+ [L in {[M in keyof O]: keyof O[M]}[keyof O]]?: L extends keyof O[K]
126
- ? O[L][M]
126
+ ? O[K][L]
127
127
  : never
128
128
  }
129
129
  }[keyof O]

5

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

2019/01/05 04:55

投稿

7Kreuz
7Kreuz

スコア112

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
- [L in keyof O[K]]: O[K][L]
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

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

2019/01/05 04:38

投稿

7Kreuz
7Kreuz

スコア112

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

続・試したことを追加

2018/12/29 04:07

投稿

7Kreuz
7Kreuz

スコア112

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

補足を追加

2018/12/29 02:05

投稿

7Kreuz
7Kreuz

スコア112

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

誤字修正

2018/12/28 05:06

投稿

7Kreuz
7Kreuz

スコア112

title CHANGED
File without changes
body CHANGED
@@ -48,7 +48,7 @@
48
48
  }
49
49
  }
50
50
 
51
- const result = (_.mapValues as MapValues2<typeof obj, typeof func>)(obj, func)
51
+ const result = (_.mapValues as MapValues<typeof obj, typeof func>)(obj, func)
52
52
  ```
53
53
 
54
54
  しかし、このときの`typeof result`は