質問編集履歴
7
コメントを元にして考えて試したソースコードを追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -83,6 +83,29 @@
|
|
83
83
|
console.log(twice(true)); // should be error
|
84
84
|
```
|
85
85
|
|
86
|
+
[コメントの指摘を元に考えたソースコード](https://www.typescriptlang.org/play/?ssl=13&ssc=12&pln=13&pc=17#code/C4TwDgpgBAKg7gSwMYQIYCMA20C8UB2ArgLboQBOUAPlAM7DkL4DmA3AFDsBmh+SwCAPb4owRCgA8MAHwAKAB4AuWAEplMKAG92UXXUTAkACyizQkQVyjyVWnXodJUtaAHIipCq8X2HfqOQQwITkIvJQAFRQAEysUAD08XRGgoSYACYEgsBQZKLg0BTkguS+-nqJAUEhIq5GEJiYgq5QANRQdQ1NrnGVtClpmXnmheTFpeVQTi4d9Iws3mWTgcGh1m3WvUn9qRlZOcMFUEUlS+WVKzUxkTFbybtD0CPHY6dlAL5ll2v4EABuFA4n3YSGEtEE2AAdE1mGZxBAJB4yOQ5NEVCoOKD8OCoTC4cgEXMmMw5J1Gs10ZiwRCINDBLCxASzORCBBKQltgM9odIC9xuwgA)
|
87
|
+
|
88
|
+
```typescript
|
89
|
+
type Twiceable = number | string;
|
90
|
+
|
91
|
+
function twice<T>(x: T): T {
|
92
|
+
switch (typeof x) {
|
93
|
+
case 'number':
|
94
|
+
return x * 2; // should not be type error
|
95
|
+
// return 'hello' + 'hello'; // should be type error
|
96
|
+
case 'string':
|
97
|
+
return x + x; // should not be type error
|
98
|
+
// return 2 * 2; // should be type error
|
99
|
+
|
100
|
+
}
|
101
|
+
return never;
|
102
|
+
}
|
103
|
+
|
104
|
+
console.log(twice<number>(2));
|
105
|
+
console.log(twice<string>('hello'));
|
106
|
+
console.log(twice(true)); // should be type error
|
107
|
+
```
|
108
|
+
|
86
109
|
### 補足情報(FW/ツールのバージョンなど)
|
87
110
|
|
88
111
|
- [TypeSript Playground](https://www.typescriptlang.org/play/index.html)
|
6
実現したい内容を,作成したいやり方から具体的なソースコードに変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
2
|
|
3
|
-
TypeScript で, 以下のアルゴリズムと型制約を満たす twice 関数
|
3
|
+
TypeScript で, 以下のアルゴリズムと型制約を満たす twice 関数のソースコードが欲しい
|
4
4
|
|
5
5
|
#### アルゴリズム
|
6
6
|
|
5
chore: 条件の言い回しを変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
#### アルゴリズム
|
6
6
|
|
7
7
|
- ~~[x] 引数の型が number または string でない場合,エラーオブジェクト(実行時エラー)を返すこと(number, string 以外の型を引数で受け取らないようにするotherwiseに相当するもの)~~
|
8
|
-
追記(DR;TL): 今回の質問の本質は「引数の型制約と引数と返り値の一致」なので,条件から削除する. ~~元々,関数型言語のパターンマッチングのように,想定外の型の条件分岐ができないようにすること,想定した型の条件分岐を強制的に書かせることの2つを満たすやり方をTypeScript で探していた. 一番目をdefaultとErrorの返却で満たせるのでは,と考えて条件に追加していた. 2つ目は,やり方が分からないので条件
|
8
|
+
追記(DR;TL): 今回の質問の本質は「引数の型制約と引数と返り値の一致」なので,条件から削除する. ~~元々,関数型言語のパターンマッチングのように,想定外の型の条件分岐ができないようにすること,想定した型の条件分岐を強制的に書かせることの2つを満たすやり方をTypeScript で探していた. 一番目をdefaultとErrorの返却で満たせるのでは,と考えて条件に追加していた. 2つ目は,やり方が分からないので条件に入れていない ~~
|
9
9
|
- [x] 数字(number)の場合は, その数字の2倍の値を返すこと
|
10
10
|
- [x] 文字列(string)の場合は, その文字列を2回繰り返した文字列を返すこと
|
11
11
|
|
4
サンプルプログラムのコメントに,エラーの種類(type error)を追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
|
28
28
|
### 該当のソースコード
|
29
29
|
|
30
|
-
[twice関数 例1 | TypeSctipt Playground](https://www.typescriptlang.org/play/?ssl=
|
30
|
+
[twice関数 例1 | TypeSctipt Playground](https://www.typescriptlang.org/play/?ssl=14&ssc=43&pln=14&pc=47#code/GYVwdgxgLglg9mABAQwM6oKYCcoDkMBu2AFAB4BcKYAngJSViHaIDeAUIp4lABZZwB3RIyEBRLPyzEARAFVGpAA4ZoGACaI4AIwBWKqJWmIA1IlK0A3GwC+bNlGrLEAFQEwIGZFoA2GRAF5hEABbLWYAH0RUKCwYMABzKzZQSFgEbjcPAB5nRAxSKAwwNVQXTM8fDAA+MkpnehdWDi5UNygIHkRiB2U4YDNaJq5hxAg0PwByMBCwrAnyZpGRrAwoECwkUkQAKkQAJgtEAHojqJ44EG8NMDgoRDDuRz9sSUWlrhPEFbWNxAmeDDebxwCYmP4AoEgw6fVDnS4aB49Z4SOBYN7DMaYP7RWIJebo97fdabMGkaGnWEXK7CW73PxIvIotHvEafIm-PY7fbks5UhH0p6M14stQYYDIS4GAlLdlINCYHD4IhScxWYa2WxsCAIVBwXwAOmB8W65WIe1oli1Or1GENcGNUFN-0BwImFqs2rAuoNRpN7gw3SwIAw7uOFLh1MRgpeqLYQA)
|
31
31
|
|
32
32
|
```TypeScript
|
33
33
|
function assertNever(x: any): never {
|
@@ -39,11 +39,11 @@
|
|
39
39
|
function twice<T extends Twiceable>(x: T): T {
|
40
40
|
switch (typeof x) {
|
41
41
|
case 'number':
|
42
|
-
return x * 2; // should not be error
|
42
|
+
return x * 2; // should not be type error
|
43
|
-
// return 'hello' + 'hello'; // should be error
|
43
|
+
// return 'hello' + 'hello'; // should be type error
|
44
44
|
case 'string':
|
45
|
-
return x + x; // should not be error
|
45
|
+
return x + x; // should not be type error
|
46
|
-
// return 2 * 2; // should be error
|
46
|
+
// return 2 * 2; // should be type error
|
47
47
|
default:
|
48
48
|
return assertNever(x);
|
49
49
|
}
|
@@ -51,7 +51,7 @@
|
|
51
51
|
|
52
52
|
console.log(twice(2));
|
53
53
|
console.log(twice('hello'));
|
54
|
-
console.log(twice(true)); // should be error
|
54
|
+
console.log(twice(true)); // should be type error
|
55
55
|
```
|
56
56
|
### 試したこと
|
57
57
|
|
3
型エラーの種類(コンパイルエラー)を追加.Errorを返す条件にotherwise の場合と追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
#### アルゴリズム
|
6
6
|
|
7
|
-
- ~~[x] 引数の型が number または string でない場合,エラーオブジェクト(実行時エラー)を返すこと~~
|
7
|
+
- ~~[x] 引数の型が number または string でない場合,エラーオブジェクト(実行時エラー)を返すこと(number, string 以外の型を引数で受け取らないようにするotherwiseに相当するもの)~~
|
8
8
|
追記(DR;TL): 今回の質問の本質は「引数の型制約と引数と返り値の一致」なので,条件から削除する. ~~元々,関数型言語のパターンマッチングのように,想定外の型の条件分岐ができないようにすること,想定した型の条件分岐を強制的に書かせることの2つを満たすやり方をTypeScript で探していた. 一番目をdefaultとErrorの返却で満たせるのでは,と考えて条件に追加していた. 2つ目は,やり方が分からないので条件から外した. ~~
|
9
9
|
- [x] 数字(number)の場合は, その数字の2倍の値を返すこと
|
10
10
|
- [x] 文字列(string)の場合は, その文字列を2回繰り返した文字列を返すこと
|
@@ -12,8 +12,8 @@
|
|
12
12
|
|
13
13
|
#### 型制約
|
14
14
|
|
15
|
-
- [x] 引数の型が number または string でない場合, 型エラーが発生すること
|
15
|
+
- [x] 引数の型が number または string でない場合, 型エラー(コンパイルエラー)が発生すること
|
16
|
-
- [ ] 引数と返り値の型が一致しない場合, 型エラーが発生すること (引数が T で返り値が T 以外の場合)
|
16
|
+
- [ ] 引数と返り値の型が一致しない場合, 型エラー(コンパイルエラー)が発生すること (引数が T で返り値が T 以外の場合)
|
17
17
|
|
18
18
|
### 発生している問題・エラーメッセージ
|
19
19
|
|
2
アルゴリズムの条件(Error オブジェクトの返却)を削除
title
CHANGED
File without changes
|
body
CHANGED
@@ -4,7 +4,8 @@
|
|
4
4
|
|
5
5
|
#### アルゴリズム
|
6
6
|
|
7
|
-
- [x] 引数の型が number または string でない場合,エラーオブジェクトを返すこと
|
7
|
+
- ~~[x] 引数の型が number または string でない場合,エラーオブジェクト(実行時エラー)を返すこと~~
|
8
|
+
追記(DR;TL): 今回の質問の本質は「引数の型制約と引数と返り値の一致」なので,条件から削除する. ~~元々,関数型言語のパターンマッチングのように,想定外の型の条件分岐ができないようにすること,想定した型の条件分岐を強制的に書かせることの2つを満たすやり方をTypeScript で探していた. 一番目をdefaultとErrorの返却で満たせるのでは,と考えて条件に追加していた. 2つ目は,やり方が分からないので条件から外した. ~~
|
8
9
|
- [x] 数字(number)の場合は, その数字の2倍の値を返すこと
|
9
10
|
- [x] 文字列(string)の場合は, その文字列を2回繰り返した文字列を返すこと
|
10
11
|
|
1
アルゴリズムに「指定した型以外の場合,にエラーを返却する条件」を追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
|
5
5
|
#### アルゴリズム
|
6
6
|
|
7
|
+
- [x] 引数の型が number または string でない場合,エラーオブジェクトを返すこと
|
7
8
|
- [x] 数字(number)の場合は, その数字の2倍の値を返すこと
|
8
9
|
- [x] 文字列(string)の場合は, その文字列を2回繰り返した文字列を返すこと
|
9
10
|
|