質問編集履歴

6

誤字

2021/09/14 03:52

投稿

tanana_m
tanana_m

スコア28

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

5

補足

2021/09/14 03:52

投稿

tanana_m
tanana_m

スコア28

test CHANGED
File without changes
test CHANGED
@@ -81,3 +81,55 @@
81
81
  }
82
82
 
83
83
  ```
84
+
85
+
86
+
87
+ ## 追記3
88
+
89
+
90
+
91
+ ```ts
92
+
93
+ const stringKeys = ['name', 'address'] as const
94
+
95
+ const numberKeys = ['phone'] as const
96
+
97
+
98
+
99
+ // 配列の型から値の型を抽出
100
+
101
+ type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType[number]
102
+
103
+
104
+
105
+ type UserString = {
106
+
107
+ [k in ArrayElement<typeof stringKeys>]: string
108
+
109
+ }
110
+
111
+ type UserNumber = {
112
+
113
+ [k in ArrayElement<typeof numberKeys>]: number
114
+
115
+ }
116
+
117
+
118
+
119
+ type User = UserString & UserNumber
120
+
121
+
122
+
123
+ const user: User = {
124
+
125
+ name: 'hoge',
126
+
127
+ address: 'hoge',
128
+
129
+ phone: 111,
130
+
131
+ }
132
+
133
+
134
+
135
+ ```

4

補足

2021/09/14 03:41

投稿

tanana_m
tanana_m

スコア28

test CHANGED
File without changes
test CHANGED
@@ -57,3 +57,27 @@
57
57
  上記のように値で持つことでチェックすることができることは理解しているのですが、例えばここに`phone: number`プロパティが追加になった場合に`userPropertys`と`User`型の2箇所に追加しなければならないことに憤りを感じています。
58
58
 
59
59
  せめて`User`型は`userPropertys`の値全てをkeyに持たないとコンパイルエラーとなるとか、`userPropertys`に列挙された値のみkeyに持てるとか、両者の繋がりを作ることでそういった安全性が欲しいのですが、何か解決手段は無いでしょうか。
60
+
61
+
62
+
63
+ ## 追記2
64
+
65
+ **なぜこのようなことをしたいのか**について触れておくと、以下のようなユーザー定義型ガードを実装する上で使用したいからです。
66
+
67
+
68
+
69
+ ```ts
70
+
71
+ const userPropertys = ['id', 'name', 'phone']
72
+
73
+ type User = { id: string; name: string; phone: number }
74
+
75
+
76
+
77
+ const Func = (value: unknown): value is keyof User => {
78
+
79
+ return typeof value === 'string' && userPropertys.includes(value)
80
+
81
+ }
82
+
83
+ ```

3

補足

2021/09/14 03:28

投稿

tanana_m
tanana_m

スコア28

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

2

質問内容の追記

2021/09/14 03:18

投稿

tanana_m
tanana_m

スコア28

test CHANGED
File without changes
test CHANGED
@@ -21,3 +21,39 @@
21
21
 
22
22
 
23
23
  よろしくお願いします。
24
+
25
+
26
+
27
+
28
+
29
+ ## 追記
30
+
31
+ 上記内容ができないようであれば、何らかの形でkeyの列挙を1箇所にまとめたいです。
32
+
33
+ もう少し具体定期なコードに落とし込むと
34
+
35
+
36
+
37
+ ```ts
38
+
39
+ const userPropertys = ['id', 'name']
40
+
41
+ type User = { id: string; name: string }
42
+
43
+
44
+
45
+ const value = 'name'
46
+
47
+ if (userPropertys.includes(value)) {
48
+
49
+ console.log('true')
50
+
51
+ }
52
+
53
+ ```
54
+
55
+
56
+
57
+ 上記のように値で持つことでチェックすることができることは理解しているのですが、例えばここに`phone`プロパティが追加になった場合に`userPropertys`と`User`型の2箇所に追加しなければならないことに憤りを感じています。
58
+
59
+ せめて`User`型は`userPropertys`の値全てをkeyに持たないとコンパイルエラーとなるとか、`userPropertys`に列挙された値のみkeyに持てるとか、両者の繋がりを作ることでそういった安全性が欲しいのですが、何か解決手段は無いでしょうか。

1

最後の一文を反映

2021/09/14 03:05

投稿

tanana_m
tanana_m

スコア28

test CHANGED
File without changes
test CHANGED
@@ -18,6 +18,6 @@
18
18
 
19
19
  もう少し具体的にやりたいことを書くと、上記の場合`foo`は`Hoge`のkeyに存在するので`true`になり、もし`value`の内容が`fuga`(`Hoge`のkeyに存在しない文字列)だった場合は`flase`になるような条件分岐を書きたいです。
20
20
 
21
-
21
+
22
22
 
23
23
  よろしくお願いします。