質問編集履歴

3

タグ修正

2021/10/13 15:59

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
File without changes

2

タイトル修正

2021/10/13 15:59

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- TypeScriptによるSPA開発でモデル相当の型を@typesディレクトリに移行するのは筋がいいやり方ですか?
1
+ __________
test CHANGED
File without changes

1

テキスト修正

2021/10/13 15:58

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,315 +1 @@
1
- はじめまして。よろしくお願いします。
2
-
3
- あるチェーン系店舗の業務システム開発をやってまして、ReactでSPA開発してます。言語はTypeScript です。
4
-
5
-
6
-
7
- 型定義ファイルについて質問させてください。
8
-
9
-
10
-
11
- サーバーサイドに用意されているGET系APIに3種類あります。
12
-
13
-
14
-
15
- 支店一覧取得: GET /branches
16
-
17
- 支店別売上取得: GET /branches/__:branch_id__/sales_amounts
18
-
19
- 支店別従業員取得: GET /branches/__:branch_id__/staffs
20
-
21
-
22
-
23
- かえってくるJSONはこんな感じです。(本当はもっとデータ数多いです)
24
-
25
-
26
-
27
- GET /branches:
28
-
29
- ```json
30
-
31
- {
32
-
33
- "branches": [
34
-
35
- { "id": 101, "name": "札幌大通り店", "address": "北海道札幌市○○区××", "tel": "011-xxx-xxxx" },
36
-
37
- { "id": 203, "name": "仙台駅前店", "address": "宮城県仙台市○○区××", "tel": "022-xxx-xxxx" }
38
-
39
- ]
40
-
41
- }
42
-
43
- ```
44
-
45
- GET /branches/:branch_id/sales_amounts:
46
-
47
- ```json
48
-
49
- {
50
-
51
- "sales_amounts": [
52
-
53
- { "month": "2019-10", "sales": 4505432, "numOfCustomers": 795 },
54
-
55
- { "month": "2019-11", "sales": 6211230, "numOfCustomers": 980 },
56
-
57
- { "month": "2019-12", "sales": 5341990, "numOfCustomers": 871 }
58
-
59
- ]
60
-
61
- }
62
-
63
- ```
64
-
65
- GET /branches/:branch_id/staffs
66
-
67
-
68
-
69
- ```json
70
-
71
- {
72
-
73
- "staffs": [
74
-
75
- { "id": "UFK005", "name": "鈴木 太郎", "gender": "M", "birthYear": 1977, "isManager": true },
76
-
77
- { "id": "UFX018", "name": "北村 優子", "gender": "F", "birthYear": 1990 },
78
-
79
- { "id": "UFT044", "name": "田中 浩二", "gender": "M", "birthYear": 1983 }
80
-
81
- ]
82
-
83
- }
84
-
85
- ```
86
-
87
-
88
-
89
- これらのJSONをフロントエンドでうけとって処理するため、各配列要素の型定義を書く場所として、ソースコードのディレクトリ`src/`に
90
-
91
- `models/`
92
-
93
- というサブディクレクトリを掘って、ここに、3つのファイルを作りました。各ファイルには型と、その型の初期値になるオブジェクトが入ってます。
94
-
95
-
96
-
97
- **1.src/models/branch.ts**
98
-
99
- ```typescript
100
-
101
- export type Branch = {
102
-
103
- id: number;
104
-
105
- name: string;
106
-
107
- address: string;
108
-
109
- tel: string;
110
-
111
- };
112
-
113
-
114
-
115
- export const defaultBranch: Branch = {
116
-
117
- id: 0,
118
-
119
- name: "",
120
-
121
- address: "",
122
-
123
- tel: ""
124
-
125
- };
126
-
127
-
128
-
129
- ```
130
-
131
-
132
-
133
- **2.src/models/sales_amount.ts**
134
-
135
- ```typescript
136
-
137
- export type SalesAmount = {
138
-
139
- month: string | null;
140
-
141
- sales: number;
142
-
143
- numOfCustomers: number;
144
-
145
- };
146
-
147
-
148
-
149
- export const defaultSalesAmount: SalesAmount = {
150
-
151
- month: null
152
-
153
- sales: 0;
154
-
155
- numOfCustomers: 0;
156
-
157
- };
158
-
159
-
160
-
161
- ```
162
-
163
-
164
-
165
- **3.src/models/staff.ts**
166
-
167
-
168
-
169
- ```typescript
170
-
171
-
172
-
173
- export type Staff = {
174
-
175
- id: string | null;
176
-
177
- name: string;
178
-
179
- gender: string | null;
180
-
181
- birthYear: number;
182
-
183
- isManager?: boolean;
184
-
185
- };
186
-
187
-
188
-
189
- export const defaultStaff: Staff = {
190
-
191
- id: null
192
-
193
- name: "";
194
-
195
- gender: null,
196
-
197
- birthYear: 0,
198
-
199
- isManager: false
200
-
201
- };
202
-
203
- ```
204
-
205
-
206
-
207
- これらのファイルを入れるのに、 `models/` というディレトリ名が適しているのかは分かりませんし、この質問の本題もそこではないです。( models/ というディレクトリ名にしたのは、現在バックエンドの開発をしているメンバーの一人が以前フロントエンドもやっていて、その人が models/ という名前にしたようです)
208
-
209
-
210
-
211
-
212
-
213
- 質問はここからになります。
214
-
215
-
216
-
217
-
218
-
219
- 現状、上記でとりあえずシステム的には問題なく動いているのですが、`models/` にある型定義をリファクタリングしようとしており、実装方法として以下をやっていくことを考えています。
220
-
221
-
222
-
223
- ① ディレクトリ `src/models` を `src/@types` と名前を変える。
224
-
225
-
226
-
227
- ② 各ファイルの拡張子を、 `.ts` から 型定義ファイルの `.d.ts` にする。
228
-
229
-
230
-
231
- ③ 各型の定義を `declare type` にする。
232
-
233
-
234
-
235
- (例)**src/@types/branch.d.ts**
236
-
237
-
238
-
239
- ```typescript
240
-
241
- declare type Branch = {
242
-
243
- id: number;
244
-
245
- name: string;
246
-
247
- address: string;
248
-
249
- tel: string;
250
-
251
- };
252
-
253
- ```
254
-
255
-
256
-
257
- このようにしておいて、 TypeScriptの設定ファイルの `typeRoots` に `src/@types`を追加すれば、型Branchを使うときに、import する必要がなくなるというメリットがあると思いました。
258
-
259
-
260
-
261
- このリファクタをやろうとしている前提で、質問は2つあります。
262
-
263
-
264
-
265
- 【質問1】
266
-
267
- このように、 `branch.ts` を`branch.d.ts` にして、 `declare` を追加することにしたときに、同じファイル `branch.d.ts` の中に、初期値オブジェクト `defaultBranch` も書いて、これをexportして使うことはできますか? つまり、こんな感じ
268
-
269
-
270
-
271
- **src/@types/branch.d.ts**
272
-
273
- ```typescript
274
-
275
- declare type Branch = {
276
-
277
- id: number;
278
-
279
- name: string;
280
-
281
- address: string;
282
-
283
- tel: string;
284
-
285
- };
286
-
287
-
288
-
289
- export const defaultBranch: Branch = {
290
-
291
- id: 0,
292
-
293
- name: "",
294
-
295
- address: "",
296
-
297
- tel: ""
298
-
299
- };
300
-
301
- ```
302
-
303
-
304
-
305
- をイメージしてますが、これは`.d.ts`ファイルとして適切な書き方になってますでしょうか?
306
-
307
-
308
-
309
- 【質問2】
310
-
311
- この例でいう `models/` に入っている業務モデル(ドメイン指向でいうエンティティ?詳しくは分かりませんが。)の型を、`@types/` という、Definitely Typed にちなんだ名前のディレクトリに入れて、 `declare` を追加するというリファクタリングは筋のよいやり方でしょうか? もし何らかの記事で、ベストプラクティスとして推薦されているのでしたらその記事をご教示いただけるとうれしいです。または、もし何か明らかな理由で、筋が悪いのであれば、その理由を教えてください。
312
-
313
-
314
-
315
- よろしくお願いいたします。
1
+ ![イメージ説明](74a1b811fea08f630ce712eba6d66fbc.png)