Как сопоставить разные ключи в типе объединения - PullRequest
0 голосов
/ 10 октября 2019

Я не уверен, как спросить это ... но, надеюсь, пример кода должен прояснить то, что я спрашиваю:

type A = {| +type: "A", +payload: "PA" |};
type B = {| +type: "B", +payload: "PB" |};

type Actions = A | B;

function dispatch<T: Actions>(type: $PropertyType<T, 'type'>, payload: $PropertyType<T, 'payload'>) {
}
 
dispatch("A", "PA"); // ok
dispatch("B", "PB"); // ok

dispatch("A", "PB"); // this doesn't error, but I'd like to
dispatch("B", "PA"); // this doesn't error, but I'd like to

dispatch("C", "PC"); // this errors properly

https://flow.org/try/#0C4TwDgpgBAglC8UDeAfKBqUkBcUBEMeANBmAIYgA2A9mQCa54AKhUKAvgNwBQW0AQgmRpM4CI37FSFGvUZNJbLt15jYAY2ABLagDsAzkLhp+PbgDMArrs07dUOlv3lg6gBYAeACq4YtvfoAfAAUfLgAJEwATtSQUaBeYt4kAOR8KYEk5FS0DFCRMXEJSV6p2bJ0GQCUyNzs3FDcjs5krm7BBFLMhFWcUAD0-VDUANZNTi7uHZIkzJK9A0OjKs2T7Z2zCngLg1AQUTFR4y1t010s2327+4crE61TeADC5y87QzfUUUA

1 Ответ

1 голос
/ 11 октября 2019

Вам понадобится тип, который позволяет искать тип по ключу, но я не думаю, что тегированные объединения допускают, к сожалению. Например, вы можете изменить свою функцию следующим образом:

type ActionsLookup = {
  A: A,
  B: B,
};
type Actions = $Values<ActionsLookup>;

function dispatch<K: $Keys<ActionsLookup>>(
  type: K, 
  payload: $ElementType<$ElementType<ActionsLookup, K>, 'payload'>
) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...