回答編集履歴
6
TypeScriptのバージョンによってanyになるため最後のtweaks、私は戦争とTypeScriptが嫌いです
test
CHANGED
@@ -130,7 +130,7 @@
|
|
130
130
|
|
131
131
|
|
132
132
|
|
133
|
-
Narrow型を使うことでオブジェクトの中身に`readonly`修飾子をつけ、呼び出し時に`as const`アサーションをつけたの
|
133
|
+
Narrow型を使うことでオブジェクトの中身に`readonly`修飾子をつけ、呼び出し時に`as const`アサーションをつけた時のような結果を得ることができます。
|
134
134
|
|
135
135
|
|
136
136
|
|
@@ -154,14 +154,6 @@
|
|
154
154
|
|
155
155
|
function unpack<T extends Input>(input: Narrow<T>): UnpackInput<T> {
|
156
156
|
|
157
|
-
Object.entries(input).map((entry) => {
|
158
|
-
|
159
|
-
// しっかりとreadonlyになっている
|
160
|
-
|
161
|
-
return entry; // (parameter) entry: [string, readonly string[] | readonly boolean[]]
|
162
|
-
|
163
|
-
});
|
164
|
-
|
165
157
|
return {} as any;
|
166
158
|
|
167
159
|
}
|
@@ -178,7 +170,7 @@
|
|
178
170
|
|
179
171
|
|
180
172
|
|
181
|
-
result.str; // (property) str: "aa" | "bb"
|
173
|
+
result.str; // (property) str: "aa" | "bb" <- "aa" | "bb" を残してくれる
|
182
174
|
|
183
175
|
result.bol; // (property) bol: true
|
184
176
|
|
@@ -194,4 +186,4 @@
|
|
194
186
|
|
195
187
|
|
196
188
|
|
197
|
-
上記Narrow型は例としてのシンプルさを優先するため、
|
189
|
+
上記Narrow型は例としてのシンプルさを優先するため、あらゆるエッジケースについて一才の考慮をしていません。実際の開発では[millsp/ts-toolbelt](https://github.com/millsp/ts-toolbelt/blob/master/sources/Function/Narrow.ts)にあるような真面目な実装を用いることをお勧めします。
|
5
tweaks
test
CHANGED
@@ -194,4 +194,4 @@
|
|
194
194
|
|
195
195
|
|
196
196
|
|
197
|
-
上記Narrow型は例としてのシンプルさを優先するため、オブジェクト
|
197
|
+
上記Narrow型は例としてのシンプルさを優先するため、特殊なオブジェクトやその他のエッジケースについて一才の考慮をしていません。実際の開発では[millsp/ts-toolbelt](https://github.com/millsp/ts-toolbelt/blob/master/sources/Function/Narrow.ts)にあるような真面目な実装を用いることをお勧めします。
|
4
注意点を追記
test
CHANGED
@@ -186,4 +186,12 @@
|
|
186
186
|
|
187
187
|
|
188
188
|
|
189
|
-
|
189
|
+
黒魔術に抵抗がなければ後者をお勧めしますが、そうでなければeslint用のルールを書いて`as const`を繰り返し書く方法が良いでしょう。
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
### 追記
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
上記Narrow型は例としてのシンプルさを優先するため、オブジェクトのネストやその他のエッジケースについて一才の考慮をしていません。実際の開発では[millsp/ts-toolbelt](https://github.com/millsp/ts-toolbelt/blob/master/sources/Function/Narrow.ts)にあるような「真面目な」実装を用いることをお勧めします。
|
3
Narrow型の実装をさらに簡略化
test
CHANGED
@@ -124,11 +124,7 @@
|
|
124
124
|
|
125
125
|
/** Narrow型の実装の一例 */
|
126
126
|
|
127
|
-
type Narrow<T> =
|
128
|
-
|
129
|
-
|
127
|
+
type Narrow<T> = { [K in keyof T]: Narrow<T[K]> } | T;
|
130
|
-
|
131
|
-
| (T extends { _?: never } ? T : never);
|
132
128
|
|
133
129
|
```
|
134
130
|
|
2
minor tweaks
test
CHANGED
@@ -116,7 +116,7 @@
|
|
116
116
|
|
117
117
|
|
118
118
|
|
119
|
-
しかし関数を呼び出す度に`as const`と書き加えるのは面倒でし、万が一書き忘れたとしてもコンパイラは注意してくれません。そこで、もう一つの選択肢としてtscの特性を~~悪用~~活用したNarrow型ハックと呼ばれる方法があります。
|
119
|
+
しかし関数を呼び出す度に`as const`と書き加えるのは面倒ですし、万が一書き忘れたとしてもコンパイラは注意してくれません。そこで、もう一つの選択肢としてtscの特性を~~悪用~~活用したNarrow型ハックと呼ばれる方法があります。
|
120
120
|
|
121
121
|
|
122
122
|
|
@@ -134,7 +134,7 @@
|
|
134
134
|
|
135
135
|
|
136
136
|
|
137
|
-
Narrow型を使うことでオブジェクトの中身に`readonly`修飾子をつけ、呼び出し時に`as const`アサーションをつけたのと同様の結果を得ることができます
|
137
|
+
Narrow型を使うことでオブジェクトの中身に`readonly`修飾子をつけ、呼び出し時に`as const`アサーションをつけたのと同様の結果を得ることができます。
|
138
138
|
|
139
139
|
|
140
140
|
|
@@ -156,9 +156,9 @@
|
|
156
156
|
|
157
157
|
|
158
158
|
|
159
|
-
function unpack<T extends Input>(
|
159
|
+
function unpack<T extends Input>(input: Narrow<T>): UnpackInput<T> {
|
160
160
|
|
161
|
-
Object.entries(
|
161
|
+
Object.entries(input).map((entry) => {
|
162
162
|
|
163
163
|
// しっかりとreadonlyになっている
|
164
164
|
|
1
誤送信分で足りない文章を追記
test
CHANGED
@@ -134,7 +134,7 @@
|
|
134
134
|
|
135
135
|
|
136
136
|
|
137
|
-
Narrow型を使うことで
|
137
|
+
Narrow型を使うことでオブジェクトの中身に`readonly`修飾子をつけ、呼び出し時に`as const`アサーションをつけたのと同様の結果を得ることができます
|
138
138
|
|
139
139
|
|
140
140
|
|
@@ -158,7 +158,13 @@
|
|
158
158
|
|
159
159
|
function unpack<T extends Input>(_input: Narrow<T>): UnpackInput<T> {
|
160
160
|
|
161
|
+
Object.entries(_input).map((entry) => {
|
161
162
|
|
163
|
+
// しっかりとreadonlyになっている
|
164
|
+
|
165
|
+
return entry; // (parameter) entry: [string, readonly string[] | readonly boolean[]]
|
166
|
+
|
167
|
+
});
|
162
168
|
|
163
169
|
return {} as any;
|
164
170
|
|
@@ -181,3 +187,7 @@
|
|
181
187
|
result.bol; // (property) bol: true
|
182
188
|
|
183
189
|
```
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
「黒魔術」に抵抗がなければ後者をお勧めしますが、そうでなければeslint用のルールを書いて`as const`を繰り返し書く方法が良いでしょう。
|