facebook / facebook/flow

Disjoint unions types with Maps

Offen
#3,466 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Rust
Sterne
22.3k
Forks
1.9k
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

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?

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.