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

質問編集履歴

7

コメントを元にして考えて試したソースコードを追加

2020/06/16 10:39

投稿

kuro3
kuro3

スコア27

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

実現したい内容を,作成したいやり方から具体的なソースコードに変更

2020/06/16 10:38

投稿

kuro3
kuro3

スコア27

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: 条件の言い回しを変更

2020/06/16 10:31

投稿

kuro3
kuro3

スコア27

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)を追加

2020/06/16 10:29

投稿

kuro3
kuro3

スコア27

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=5&ssc=6&pln=5&pc=15#code/GYVwdgxgLglg9mABAQwM6oKYCcoDkMBu2AFAB4BcKYAngJSViHaIDeAUIp4lABZZwB3RIyEBRLPyzEARAFVGpAA4ZoGACaI4AIwBWKqJWmIA1IlK0A3GwC+bNlGrLEAFQEwIGZFoA2GRAF5hEABbLWYAH0RUKCwYMABzKzZQSFgEbjcPAB5nRAxSKAwwNVQXTM8fDAA+MkpnehdWDi5UNygIHkRiB2U4YDNaJq5hxAg0PwByMBCwrAnyZpGRrAwoECwkUkQAKkQAJgtEAHojqJ44EG8NMDgoRDC8iTgsRaWuE8QVtY3ECZ4MbzeOATEy-f6A4GHD6oc6XDQPbCSV7DMaYX7RWIJebIt5fdabUGkKGnGEXK7CW73PyI544pYfPE-PY7fbEs5k+HUp4vN6INQYYDIS4GOnLVb4lDobB4JhScxWYa2WxsCAIVBwXwAOiB8W65WIe1olhVao1GG1cF1UH1fwBQImRqsqrA6q1Or17gw3SwIAwjuOJNh5IR3LYQA)
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 の場合と追記

2020/06/16 10:27

投稿

kuro3
kuro3

スコア27

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 オブジェクトの返却)を削除

2020/06/16 10:21

投稿

kuro3
kuro3

スコア27

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

アルゴリズムに「指定した型以外の場合,にエラーを返却する条件」を追加

2020/06/16 10:09

投稿

kuro3
kuro3

スコア27

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