Disjoint unions types with Maps
- Dominant language
- Rust
- Stars
- 22.3k
- Forks
- 1.9k
- PR merge metrics
- No merged PRs in 30d
Description
I'm trying to use `Map` as a collection of message handlers. My setup code looks like this:
```javascript
type OkMessage = {
type: "ok",
result: string
}
type ErrorMessage = {
type: "error",
error: string
}
type Messages = OkMessage | ErrorMessage
type MessageHandler = (message: Messages) => void
type MessageHandlers = Map
const messageHandlers: MessageHandlers = new Map()
messageHandlers.set(
"ok",
(message: OkMessage): void => console.log(message.result)
)
messageHandlers.set(
"error",
(message: ErrorMessage): void => console.error(message.error)
)
function handleMessage(message: Messages): void {
const handler = messageHandlers.get(message.type)
handler && handler(message)
}
```
`Messages` is a disjoint union type if I understood it correctly. A code branch will be invoked depending on the `message.type` attribute.
This code snippet, however, gives me a bunch of errors:
```
2: type: "ok",
^ string literal `ok`. Expected string literal `error`, got `ok` instead
6: type: "error",
^ string literal `error`
6: type: "error",
^ string literal `error`. Expected string literal `ok`, got `error` instead
2: type: "ok",
^ string literal `ok`
17: (message: OkMessage): void => console.log(message.result)
^ property `result`. Property not found in
10: type MessageHandler = (message: Messages) => void
^ object type
2: type: "ok",
^ string literal `ok`. Expected string literal `error`, got `ok` instead
6: type: "error",
^ string literal `error`
6: type: "error",
^ string literal `error`. Expected string literal `ok`, got `error` instead
2: type: "ok",
^ string literal `ok`
21: (message: ErrorMessage): void => console.error(message.error)
^ property `error`. Property not found in
10: type MessageHandler = (message: Messages) => void
^ object type
```
[Try it for yourself.](https://flowtype.org/try/#0C4TwDgpgBA8g1gWQgZ2QQwObQLxQN4BQUUokAXFAEQD2clANEVAE4oCuANsBcsMwJYA7DAQC+BUtACizZtWZJUmHPiaSKlCLPkMmWucx58hI8ZKiL0WZFFzxLyqAB8oMgw6wTw0DxAASaIIAJhxatlAAFAC2KFYQFL7IAJS2AHxQAG7U-EFekBaxygHBocw2uAhoYAA8vALC9AVKWMUhWqkEBADG1IK8UDHN-oFtZQmFLSOl5VCCEADuFlURSZ2Dca3TAHTIEMARTDR0jMTRE-GwiOdJFFk5aVA9fdShWxzUGGdDW6zInMCrVbrIpTLTIHZ7A7ETTaZi6U7ArAUNzyXw3TLZIIPJ7IF4QLb6eRfOIE2GAzoAMzYgi6wH4vSgAAtQb5icpxkNkrdMapiDjgEzQcxwojhiUwVssPtRVtJKsmMzxcKAGTKwVKtlYVaiIA)
Am I missing something or is this a bug in Flow?
Contributor guide
Assessment
This issue has not been assessed yet.