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

質問編集履歴

6

誤字

2021/09/14 03:52

投稿

tanana_m
tanana_m

スコア28

title CHANGED
@@ -1,1 +1,1 @@
1
- TypeSciprである文字列が特定のObject型のkeyに存在しているかを確認したい
1
+ TypeSciptである文字列が特定のObject型のkeyに存在しているかを確認したい
body CHANGED
File without changes

5

補足

2021/09/14 03:52

投稿

tanana_m
tanana_m

スコア28

title CHANGED
File without changes
body CHANGED
@@ -39,4 +39,30 @@
39
39
  const Func = (value: unknown): value is keyof User => {
40
40
  return typeof value === 'string' && userPropertys.includes(value)
41
41
  }
42
+ ```
43
+
44
+ ## 追記3
45
+
46
+ ```ts
47
+ const stringKeys = ['name', 'address'] as const
48
+ const numberKeys = ['phone'] as const
49
+
50
+ // 配列の型から値の型を抽出
51
+ type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType[number]
52
+
53
+ type UserString = {
54
+ [k in ArrayElement<typeof stringKeys>]: string
55
+ }
56
+ type UserNumber = {
57
+ [k in ArrayElement<typeof numberKeys>]: number
58
+ }
59
+
60
+ type User = UserString & UserNumber
61
+
62
+ const user: User = {
63
+ name: 'hoge',
64
+ address: 'hoge',
65
+ phone: 111,
66
+ }
67
+
42
68
  ```

4

補足

2021/09/14 03:41

投稿

tanana_m
tanana_m

スコア28

title CHANGED
File without changes
body CHANGED
@@ -27,4 +27,16 @@
27
27
  ```
28
28
 
29
29
  上記のように値で持つことでチェックすることができることは理解しているのですが、例えばここに`phone: number`プロパティが追加になった場合に`userPropertys`と`User`型の2箇所に追加しなければならないことに憤りを感じています。
30
- せめて`User`型は`userPropertys`の値全てをkeyに持たないとコンパイルエラーとなるとか、`userPropertys`に列挙された値のみkeyに持てるとか、両者の繋がりを作ることでそういった安全性が欲しいのですが、何か解決手段は無いでしょうか。
30
+ せめて`User`型は`userPropertys`の値全てをkeyに持たないとコンパイルエラーとなるとか、`userPropertys`に列挙された値のみkeyに持てるとか、両者の繋がりを作ることでそういった安全性が欲しいのですが、何か解決手段は無いでしょうか。
31
+
32
+ ## 追記2
33
+ **なぜこのようなことをしたいのか**について触れておくと、以下のようなユーザー定義型ガードを実装する上で使用したいからです。
34
+
35
+ ```ts
36
+ const userPropertys = ['id', 'name', 'phone']
37
+ type User = { id: string; name: string; phone: number }
38
+
39
+ const Func = (value: unknown): value is keyof User => {
40
+ return typeof value === 'string' && userPropertys.includes(value)
41
+ }
42
+ ```

3

補足

2021/09/14 03:28

投稿

tanana_m
tanana_m

スコア28

title CHANGED
File without changes
body CHANGED
@@ -26,5 +26,5 @@
26
26
  }
27
27
  ```
28
28
 
29
- 上記のように値で持つことでチェックすることができることは理解しているのですが、例えばここに`phone`プロパティが追加になった場合に`userPropertys`と`User`型の2箇所に追加しなければならないことに憤りを感じています。
29
+ 上記のように値で持つことでチェックすることができることは理解しているのですが、例えばここに`phone: number`プロパティが追加になった場合に`userPropertys`と`User`型の2箇所に追加しなければならないことに憤りを感じています。
30
30
  せめて`User`型は`userPropertys`の値全てをkeyに持たないとコンパイルエラーとなるとか、`userPropertys`に列挙された値のみkeyに持てるとか、両者の繋がりを作ることでそういった安全性が欲しいのですが、何か解決手段は無いでしょうか。

2

質問内容の追記

2021/09/14 03:18

投稿

tanana_m
tanana_m

スコア28

title CHANGED
File without changes
body CHANGED
@@ -9,4 +9,22 @@
9
9
 
10
10
  もう少し具体的にやりたいことを書くと、上記の場合`foo`は`Hoge`のkeyに存在するので`true`になり、もし`value`の内容が`fuga`(`Hoge`のkeyに存在しない文字列)だった場合は`flase`になるような条件分岐を書きたいです。
11
11
 
12
- よろしくお願いします。
12
+ よろしくお願いします。
13
+
14
+
15
+ ## 追記
16
+ 上記内容ができないようであれば、何らかの形でkeyの列挙を1箇所にまとめたいです。
17
+ もう少し具体定期なコードに落とし込むと
18
+
19
+ ```ts
20
+ const userPropertys = ['id', 'name']
21
+ type User = { id: string; name: string }
22
+
23
+ const value = 'name'
24
+ if (userPropertys.includes(value)) {
25
+ console.log('true')
26
+ }
27
+ ```
28
+
29
+ 上記のように値で持つことでチェックすることができることは理解しているのですが、例えばここに`phone`プロパティが追加になった場合に`userPropertys`と`User`型の2箇所に追加しなければならないことに憤りを感じています。
30
+ せめて`User`型は`userPropertys`の値全てをkeyに持たないとコンパイルエラーとなるとか、`userPropertys`に列挙された値のみkeyに持てるとか、両者の繋がりを作ることでそういった安全性が欲しいのですが、何か解決手段は無いでしょうか。

1

最後の一文を反映

2021/09/14 03:05

投稿

tanana_m
tanana_m

スコア28

title CHANGED
File without changes
body CHANGED
@@ -8,5 +8,5 @@
8
8
  上記の型定義と変数が存在する時、`value`(string型変数)の内容が`Hoge`のkeyに存在するかを確認したいです。
9
9
 
10
10
  もう少し具体的にやりたいことを書くと、上記の場合`foo`は`Hoge`のkeyに存在するので`true`になり、もし`value`の内容が`fuga`(`Hoge`のkeyに存在しない文字列)だった場合は`flase`になるような条件分岐を書きたいです。
11
-
11
+
12
12
  よろしくお願いします。