回答編集履歴

6

TypeScriptのバージョンによってanyになるため最後のtweaks、私は戦争とTypeScriptが嫌いです

2021/11/09 04:47

投稿

itepechi
itepechi

スコア248

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型は例としてのシンプルさを優先するため、特殊なオブジェクトやその他のエッジケースについて一才の考慮をしていません。実際の開発では[millsp/ts-toolbelt](https://github.com/millsp/ts-toolbelt/blob/master/sources/Function/Narrow.ts)にあるような真面目な実装を用いることをお勧めします。
189
+ 上記Narrow型は例としてのシンプルさを優先するため、あらゆるエッジケースについて一才の考慮をしていません。実際の開発では[millsp/ts-toolbelt](https://github.com/millsp/ts-toolbelt/blob/master/sources/Function/Narrow.ts)にあるような真面目な実装を用いることをお勧めします。

5

tweaks

2021/11/09 04:47

投稿

itepechi
itepechi

スコア248

test CHANGED
@@ -194,4 +194,4 @@
194
194
 
195
195
 
196
196
 
197
- 上記Narrow型は例としてのシンプルさを優先するため、オブジェクトのネストやその他のエッジケースについて一才の考慮をしていません。実際の開発では[millsp/ts-toolbelt](https://github.com/millsp/ts-toolbelt/blob/master/sources/Function/Narrow.ts)にあるような真面目な実装を用いることをお勧めします。
197
+ 上記Narrow型は例としてのシンプルさを優先するため、特殊なオブジェクトやその他のエッジケースについて一才の考慮をしていません。実際の開発では[millsp/ts-toolbelt](https://github.com/millsp/ts-toolbelt/blob/master/sources/Function/Narrow.ts)にあるような真面目な実装を用いることをお勧めします。

4

注意点を追記

2021/11/09 04:40

投稿

itepechi
itepechi

スコア248

test CHANGED
@@ -186,4 +186,12 @@
186
186
 
187
187
 
188
188
 
189
- 黒魔術に抵抗がなければ後者をお勧めしますが、そうでなければeslint用のルールを書いて`as const`を繰り返し書く方法が良いでしょう。
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型の実装をさらに簡略化

2021/11/09 04:35

投稿

itepechi
itepechi

スコア248

test CHANGED
@@ -124,11 +124,7 @@
124
124
 
125
125
  /** Narrow型の実装の一例 */
126
126
 
127
- type Narrow<T> =
128
-
129
- | { [K in keyof T]: Narrow<T[K]> }
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

2021/11/09 04:22

投稿

itepechi
itepechi

スコア248

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>(_input: Narrow<T>): UnpackInput<T> {
159
+ function unpack<T extends Input>(input: Narrow<T>): UnpackInput<T> {
160
160
 
161
- Object.entries(_input).map((entry) => {
161
+ Object.entries(input).map((entry) => {
162
162
 
163
163
  // しっかりとreadonlyになっている
164
164
 

1

誤送信分で足りない文章を追記

2021/11/09 04:03

投稿

itepechi
itepechi

スコア248

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`を繰り返し書く方法が良いでしょう。