slackapi / node-slack-sdk

Slack Developer Kit for Node.js
https://slack.dev/node-slack-sdk
MIT License
3.26k stars 656 forks source link

types 3.0: discriminated union types where appropriate #1816

Open filmaj opened 3 weeks ago

filmaj commented 3 weeks ago

This issue comes out of #1227 and has one example of the suggestion to use discriminated unions in the draft PR #1228 (in this commit specifically).

Discriminated union types let us more accurately model certain kinds of either/or and hierarchical constraints. This article is one example goes into more detail about what this is and how to use it.

We also already use it extensively in the web-api package to model certain API request parameter constraints. The classic example where discriminated unions are useful within Slack is when modeling the parameters for the chat.postMessage method. This method requires one of text, blocks or attachments to be present - and with a discriminated union we model this constraint accurately!

Discriminated Union Usage Areas

➜ ack discrim src
src/message-attachments.ts
4:// TODO: breaking changes, use discriminated union for `fallback`, `text` and `block` properties, maybe LegacyAttachment
7:// also further nested discriminated union types that could be helpful here:

src/block-kit/blocks.ts
250:// TODO: breaking change: use a discriminative union to represent section block using `text` or `fields` but

src/block-kit/block-elements.ts
283:  // TODO: breaking change: use discriminative union and separate types for static select of options vs. option groups
289:  // TODO: breaking change: use discriminative union and separate types for static select of options vs. option groups
297:  // options, whereas the below doesn't. Also use a discriminative union here to separate option vs. option groups
324:  // TODO: breaking change: use discriminative union and separate types for static select of options vs. option groups
330:  // TODO: breaking change: use discriminative union and separate types for static select of options vs. option groups
338:  // options, whereas the below doesn't. Also use a discriminative union here to separate option vs. option groups
399:// TODO: breaking change: maybe can use a discriminative union to differentiate between a multi-select convo element