質問編集履歴
7
コメントを元にして考えて試したソースコードを追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -168,6 +168,52 @@
|
|
168
168
|
|
169
169
|
|
170
170
|
|
171
|
+
[コメントの指摘を元に考えたソースコード](https://www.typescriptlang.org/play/?ssl=13&ssc=12&pln=13&pc=17#code/C4TwDgpgBAKg7gSwMYQIYCMA20C8UB2ArgLboQBOUAPlAM7DkL4DmA3AFDsBmh+SwCAPb4owRCgA8MAHwAKAB4AuWAEplMKAG92UXXUTAkACyizQkQVyjyVWnXodJUtaAHIipCq8X2HfqOQQwITkIvJQAFRQAEysUAD08XRGgoSYACYEgsBQZKLg0BTkguS+-nqJAUEhIq5GEJiYgq5QANRQdQ1NrnGVtClpmXnmheTFpeVQTi4d9Iws3mWTgcGh1m3WvUn9qRlZOcMFUEUlS+WVKzUxkTFbybtD0CPHY6dlAL5ll2v4EABuFA4n3YSGEtEE2AAdE1mGZxBAJB4yOQ5NEVCoOKD8OCoTC4cgEXMmMw5J1Gs10ZiwRCINDBLCxASzORCBBKQltgM9odIC9xuwgA)
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
```typescript
|
176
|
+
|
177
|
+
type Twiceable = number | string;
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
function twice<T>(x: T): T {
|
182
|
+
|
183
|
+
switch (typeof x) {
|
184
|
+
|
185
|
+
case 'number':
|
186
|
+
|
187
|
+
return x * 2; // should not be type error
|
188
|
+
|
189
|
+
// return 'hello' + 'hello'; // should be type error
|
190
|
+
|
191
|
+
case 'string':
|
192
|
+
|
193
|
+
return x + x; // should not be type error
|
194
|
+
|
195
|
+
// return 2 * 2; // should be type error
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
}
|
200
|
+
|
201
|
+
return never;
|
202
|
+
|
203
|
+
}
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
console.log(twice<number>(2));
|
208
|
+
|
209
|
+
console.log(twice<string>('hello'));
|
210
|
+
|
211
|
+
console.log(twice(true)); // should be type error
|
212
|
+
|
213
|
+
```
|
214
|
+
|
215
|
+
|
216
|
+
|
171
217
|
### 補足情報(FW/ツールのバージョンなど)
|
172
218
|
|
173
219
|
|
6
実現したい内容を,作成したいやり方から具体的なソースコードに変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
TypeScript で, 以下のアルゴリズムと型制約を満たす twice 関数
|
5
|
+
TypeScript で, 以下のアルゴリズムと型制約を満たす twice 関数のソースコードが欲しい
|
6
6
|
|
7
7
|
|
8
8
|
|
5
chore: 条件の言い回しを変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
- ~~[x] 引数の型が number または string でない場合,エラーオブジェクト(実行時エラー)を返すこと(number, string 以外の型を引数で受け取らないようにするotherwiseに相当するもの)~~
|
14
14
|
|
15
|
-
追記(DR;TL): 今回の質問の本質は「引数の型制約と引数と返り値の一致」なので,条件から削除する. ~~元々,関数型言語のパターンマッチングのように,想定外の型の条件分岐ができないようにすること,想定した型の条件分岐を強制的に書かせることの2つを満たすやり方をTypeScript で探していた. 一番目をdefaultとErrorの返却で満たせるのでは,と考えて条件に追加していた. 2つ目は,やり方が分からないので条件
|
15
|
+
追記(DR;TL): 今回の質問の本質は「引数の型制約と引数と返り値の一致」なので,条件から削除する. ~~元々,関数型言語のパターンマッチングのように,想定外の型の条件分岐ができないようにすること,想定した型の条件分岐を強制的に書かせることの2つを満たすやり方をTypeScript で探していた. 一番目をdefaultとErrorの返却で満たせるのでは,と考えて条件に追加していた. 2つ目は,やり方が分からないので条件に入れていない ~~
|
16
16
|
|
17
17
|
- [x] 数字(number)の場合は, その数字の2倍の値を返すこと
|
18
18
|
|
4
サンプルプログラムのコメントに,エラーの種類(type error)を追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -56,7 +56,7 @@
|
|
56
56
|
|
57
57
|
|
58
58
|
|
59
|
-
[twice関数 例1 | TypeSctipt Playground](https://www.typescriptlang.org/play/?ssl=
|
59
|
+
[twice関数 例1 | TypeSctipt Playground](https://www.typescriptlang.org/play/?ssl=14&ssc=43&pln=14&pc=47#code/GYVwdgxgLglg9mABAQwM6oKYCcoDkMBu2AFAB4BcKYAngJSViHaIDeAUIp4lABZZwB3RIyEBRLPyzEARAFVGpAA4ZoGACaI4AIwBWKqJWmIA1IlK0A3GwC+bNlGrLEAFQEwIGZFoA2GRAF5hEABbLWYAH0RUKCwYMABzKzZQSFgEbjcPAB5nRAxSKAwwNVQXTM8fDAA+MkpnehdWDi5UNygIHkRiB2U4YDNaJq5hxAg0PwByMBCwrAnyZpGRrAwoECwkUkQAKkQAJgtEAHojqJ44EG8NMDgoRDDuRz9sSUWlrhPEFbWNxAmeDDebxwCYmP4AoEgw6fVDnS4aB49Z4SOBYN7DMaYP7RWIJebo97fdabMGkaGnWEXK7CW73PxIvIotHvEafIm-PY7fbks5UhH0p6M14stQYYDIS4GAlLdlINCYHD4IhScxWYa2WxsCAIVBwXwAOmB8W65WIe1oli1Or1GENcGNUFN-0BwImFqs2rAuoNRpN7gw3SwIAw7uOFLh1MRgpeqLYQA)
|
60
60
|
|
61
61
|
|
62
62
|
|
@@ -80,15 +80,15 @@
|
|
80
80
|
|
81
81
|
case 'number':
|
82
82
|
|
83
|
-
return x * 2; // should not be error
|
83
|
+
return x * 2; // should not be type error
|
84
84
|
|
85
|
-
// return 'hello' + 'hello'; // should be error
|
85
|
+
// return 'hello' + 'hello'; // should be type error
|
86
86
|
|
87
87
|
case 'string':
|
88
88
|
|
89
|
-
return x + x; // should not be error
|
89
|
+
return x + x; // should not be type error
|
90
90
|
|
91
|
-
// return 2 * 2; // should be error
|
91
|
+
// return 2 * 2; // should be type error
|
92
92
|
|
93
93
|
default:
|
94
94
|
|
@@ -104,7 +104,7 @@
|
|
104
104
|
|
105
105
|
console.log(twice('hello'));
|
106
106
|
|
107
|
-
console.log(twice(true)); // should be error
|
107
|
+
console.log(twice(true)); // should be type error
|
108
108
|
|
109
109
|
```
|
110
110
|
|
3
型エラーの種類(コンパイルエラー)を追加.Errorを返す条件にotherwise の場合と追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
-
- ~~[x] 引数の型が number または string でない場合,エラーオブジェクト(実行時エラー)を返すこと~~
|
13
|
+
- ~~[x] 引数の型が number または string でない場合,エラーオブジェクト(実行時エラー)を返すこと(number, string 以外の型を引数で受け取らないようにするotherwiseに相当するもの)~~
|
14
14
|
|
15
15
|
追記(DR;TL): 今回の質問の本質は「引数の型制約と引数と返り値の一致」なので,条件から削除する. ~~元々,関数型言語のパターンマッチングのように,想定外の型の条件分岐ができないようにすること,想定した型の条件分岐を強制的に書かせることの2つを満たすやり方をTypeScript で探していた. 一番目をdefaultとErrorの返却で満たせるのでは,と考えて条件に追加していた. 2つ目は,やり方が分からないので条件から外した. ~~
|
16
16
|
|
@@ -26,9 +26,9 @@
|
|
26
26
|
|
27
27
|
|
28
28
|
|
29
|
-
- [x] 引数の型が number または string でない場合, 型エラーが発生すること
|
29
|
+
- [x] 引数の型が number または string でない場合, 型エラー(コンパイルエラー)が発生すること
|
30
30
|
|
31
|
-
- [ ] 引数と返り値の型が一致しない場合, 型エラーが発生すること (引数が T で返り値が T 以外の場合)
|
31
|
+
- [ ] 引数と返り値の型が一致しない場合, 型エラー(コンパイルエラー)が発生すること (引数が T で返り値が T 以外の場合)
|
32
32
|
|
33
33
|
|
34
34
|
|
2
アルゴリズムの条件(Error オブジェクトの返却)を削除
test
CHANGED
File without changes
|
test
CHANGED
@@ -10,7 +10,9 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
-
- [x] 引数の型が number または string でない場合,エラーオブジェクトを返すこと
|
13
|
+
- ~~[x] 引数の型が number または string でない場合,エラーオブジェクト(実行時エラー)を返すこと~~
|
14
|
+
|
15
|
+
追記(DR;TL): 今回の質問の本質は「引数の型制約と引数と返り値の一致」なので,条件から削除する. ~~元々,関数型言語のパターンマッチングのように,想定外の型の条件分岐ができないようにすること,想定した型の条件分岐を強制的に書かせることの2つを満たすやり方をTypeScript で探していた. 一番目をdefaultとErrorの返却で満たせるのでは,と考えて条件に追加していた. 2つ目は,やり方が分からないので条件から外した. ~~
|
14
16
|
|
15
17
|
- [x] 数字(number)の場合は, その数字の2倍の値を返すこと
|
16
18
|
|
1
アルゴリズムに「指定した型以外の場合,にエラーを返却する条件」を追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -9,6 +9,8 @@
|
|
9
9
|
#### アルゴリズム
|
10
10
|
|
11
11
|
|
12
|
+
|
13
|
+
- [x] 引数の型が number または string でない場合,エラーオブジェクトを返すこと
|
12
14
|
|
13
15
|
- [x] 数字(number)の場合は, その数字の2倍の値を返すこと
|
14
16
|
|