Clear, clean and concise, are some of the adjectives I would associate with an API that makes for a pleasant and productive development experience.
TypeScript offers a great feature — discriminated unions — that you can use to build such API’s.
Discriminated unions, also called tagged unions, represent a finite, well-defined set of choices.
Implementing a discriminated union in TypesScript
If you have a class with a literal member then you can use that property to discriminate between union members.
As an example consider the union of a
Rectangle, here we have a member
kindthat exists on both union members and is of a particular literal type:
Designing the API
The Chat API will receive requests from chat users and return appropriate responses.
The chat users will issue the following requests:
- RequestNotification (request for notification of events in the chat room)
The server in turn will respond with one of the following notifications:
- LoggedOnUsers (a list of users who available for chat, provided at logon time)
- UserJoined (notification that a new user has joined the chat)
- UserLeft (notification that a user has left the chat)
- Nothing (when the user log’s off there is nothing more to say)
The definition of the request model in TypeScript is as follows
… and likewise for the response
Thus, in a few lines of code I have described all the cases that the Chat API needs to handle.
I can then use a switch statement to handle every case as required.
The default clause in the switch ensures that we have handled all possible request types.
If I extend the API in future the compiler will ensure that I’ve handled the new cases. This is a fantastic way to future proof against bugs.
Thanks for reading and if you found this article helpful, please hit the 👏 button and share the article, so that others can find it easily. Cheers.