Skip to content

Commit 173b3e0

Browse files
author
Hyunje Jun
committed
Use literal types for 'type' fields of objects
1 parent af2ecd8 commit 173b3e0

File tree

1 file changed

+64
-40
lines changed

1 file changed

+64
-40
lines changed

types/global.d.ts

Lines changed: 64 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -22,33 +22,33 @@ declare namespace Line {
2222
statusMessage: string,
2323
};
2424

25-
export type Typed = { type: string };
26-
2725
export type WebhookEvent =
2826
MessageEvent | FollowEvent | UnfollowEvent | JoinEvent |
2927
LeaveEvent | PostbackEvent | BeaconEvent;
3028

31-
export type EventBase = Typed & {
29+
export type EventBase = {
3230
timestamp: number,
3331
source: EventSource,
3432
};
3533

3634
export type EventSource = User | Group | Room;
3735

38-
export type User = Typed & { userId: string };
39-
export type Group = Typed & { groupId: string, userId?: string };
40-
export type Room = Typed & { roomId: string, userId?: string };
36+
export type User = { type: "user", userId: string };
37+
export type Group = { type: "group", groupId: string, userId?: string };
38+
export type Room = { type: "room", roomId: string, userId?: string };
4139

4240
export type ReplyableEvent = EventBase & { replyToken: string };
4341

44-
export type MessageEvent = ReplyableEvent & { message: EventMessage };
45-
export type FollowEvent = ReplyableEvent;
46-
export type UnfollowEvent = EventBase;
47-
export type JoinEvent = ReplyableEvent;
48-
export type LeaveEvent = EventBase;
49-
export type PostbackEvent = ReplyableEvent & { postback: { data: string } };
42+
export type MessageEvent = { type: "message", message: EventMessage } & ReplyableEvent;
43+
export type FollowEvent = { type: "follow" } & ReplyableEvent;
44+
export type UnfollowEvent = { type: "unfollow" } & EventBase;
45+
export type JoinEvent = { type: "join" } & ReplyableEvent;
46+
export type LeaveEvent = { type: "leave" } & EventBase;
47+
export type PostbackEvent = { type: "postback", postback: { data: string } } & ReplyableEvent;
5048
export type BeaconEvent = ReplyableEvent & {
51-
beacon: Typed & {
49+
type: "beacon",
50+
beacon: {
51+
type: "enter" | "leave" | "banner",
5252
hwid: string,
5353
dm?: string,
5454
},
@@ -58,80 +58,94 @@ declare namespace Line {
5858
TextEventMessage | ImageEventMessage | VideoEventMessage |
5959
AudioEventMessage | LocationEventMessage | StickerEventMessage;
6060

61-
export type EventMessageBase = Typed & { id: string };
62-
export type TextEventMessage = EventMessageBase & { text: string };
63-
export type ImageEventMessage = EventMessageBase;
64-
export type VideoEventMessage = EventMessageBase;
65-
export type AudioEventMessage = EventMessageBase;
66-
export type LocationEventMessage = EventMessageBase & {
61+
export type EventMessageBase = { id: string };
62+
export type TextEventMessage = { type: "text", text: string } & EventMessageBase;
63+
export type ImageEventMessage = { type: "image" } & EventMessageBase;
64+
export type VideoEventMessage = { type: "video" } & EventMessageBase;
65+
export type AudioEventMessage = { type: "audio" } & EventMessageBase;
66+
export type LocationEventMessage = {
67+
type: "location"
6768
title: string,
6869
address: string,
6970
latitude: number,
7071
longitude: number,
71-
};
72-
export type StickerEventMessage = EventMessageBase & {
72+
} & EventMessageBase;
73+
export type StickerEventMessage = {
74+
type: "sticker",
7375
packageId: string,
7476
stickerId: string,
75-
};
77+
} & EventMessageBase;
7678

7779
export type Message =
7880
TextMessage | ImageMessage | VideoMessage | AudioMessage |
7981
LocationMessage | StickerMessage | ImageMapMessage |
8082
TemplateMessage;
8183

82-
export type TextMessage = Typed & { text: string };
83-
export type ImageMessage = Typed & {
84+
export type TextMessage = {
85+
type: "text",
86+
text: string
87+
};
88+
export type ImageMessage = {
89+
type: "image",
8490
originalContentUrl: string,
8591
previewImageUrl: string,
8692
};
87-
export type VideoMessage = Typed & {
93+
export type VideoMessage = {
94+
type: "video",
8895
originalContentUrl: string,
8996
previewImageUrl: string,
9097
};
91-
export type AudioMessage = Typed & {
98+
export type AudioMessage = {
99+
type: "audio",
92100
originalContentUrl: string,
93101
duration: string,
94102
};
95-
export type LocationMessage = Typed & {
103+
export type LocationMessage = {
104+
type: "location",
96105
title: string,
97106
address: string,
98107
latitude: number,
99108
longitude: number,
100109
};
101-
export type StickerMessage = Typed & {
110+
export type StickerMessage = {
111+
type: "sticker",
102112
packageId: string,
103113
stickerId: string,
104114
};
105-
export type ImageMapMessage = Typed & {
115+
export type ImageMapMessage = {
116+
type: "image",
106117
baseUrl: string,
107118
altText: string,
108119
baseSize: { width: number, height: number },
109120
actions: ImageMapAction[],
110121
};
111-
export type TemplateMessage = Typed & {
122+
export type TemplateMessage = {
123+
type: "template",
112124
altText: string,
113125
template: TemplateContent,
114126
};
115127

116128
export type ImageMapAction = ImageMapURIAction | ImageMapMessageAction;
117-
export type ImageMapActionBase = Typed & { area: ImageMapArea };
118-
export type ImageMapURIAction = ImageMapActionBase & { linkUri: string };
119-
export type ImageMapMessageAction = ImageMapActionBase & { text: string };
129+
export type ImageMapActionBase = { area: ImageMapArea };
130+
export type ImageMapURIAction = { type: "uri", linkUri: string } & ImageMapActionBase;
131+
export type ImageMapMessageAction = { type: "message", text: string } & ImageMapActionBase;
120132

121133
export type ImageMapArea = { x: number, y: number, width: number, height: number };
122134

123135
export type TemplateContent = TemplateButtons | TemplateConfirm | TemplateCarousel;
124-
export type TemplateButtons = Typed & {
136+
export type TemplateButtons = {
137+
type: "buttons",
125138
thumbnailImageUrl?: string,
126139
title?: string,
127140
text: string,
128141
actions: TemplateAction[],
129142
};
130-
export type TemplateConfirm = Typed & {
143+
export type TemplateConfirm = {
144+
type: "confirm",
131145
text: string,
132146
actions: TemplateAction[],
133147
};
134-
export type TemplateCarousel = Typed & { columns: TemplateColumn[] };
148+
export type TemplateCarousel = { type: "carousel", columns: TemplateColumn[] };
135149

136150
export type TemplateColumn = {
137151
thumbnailImageUrl?: string,
@@ -141,8 +155,18 @@ declare namespace Line {
141155
};
142156

143157
export type TemplateAction = TemplatePostbackAction | TemplateMessageAction | TemplateURIAction;
144-
export type TemplateActionBase = Typed & { label: string };
145-
export type TemplatePostbackAction = TemplateActionBase & { data: string, text?: string };
146-
export type TemplateMessageAction = TemplateActionBase & { text: string };
147-
export type TemplateURIAction = TemplateActionBase & { uri: string };
158+
export type TemplateActionBase = { label: string };
159+
export type TemplatePostbackAction = {
160+
type: "postback",
161+
data: string,
162+
text?: string,
163+
} & TemplateActionBase;
164+
export type TemplateMessageAction = {
165+
type: "message",
166+
text: string,
167+
} & TemplateActionBase;
168+
export type TemplateURIAction = {
169+
type: "template",
170+
uri: string,
171+
} & TemplateActionBase;
148172
}

0 commit comments

Comments
 (0)