Поток дизъюнктного объединения, основанный на том, существует ли свойство - PullRequest
0 голосов
/ 07 мая 2018

Интересно, можно ли как-нибудь уточнить непересекающееся объединение, основываясь на том, существует ли свойство, как-то так:

type Success = {| success: string |};
type Failed = {| error: string |};

type Response = Success | Failed;

function handleResponse(response: Response) {
  if (response.hasOwnProperty('success')) {
    // It is a Success
    var value: string = response.success;
  } else {
    // It is an Error
    var message: string = response.error;
  }
}

Этот код дает мне следующие ошибки:

11:     var value: string = response.success;
                                     ^ Cannot get `response.success` because property `success` is missing in `Failed` [1].
References:
8: function handleResponse(response: Response) {
                                     ^ [1]
14:     var message: string = response.error;
                                       ^ Cannot get `response.error` because property `error` is missing in `Success` [1].
References:
8: function handleResponse(response: Response) {
                                     ^ [1]

Я хочу быть уверен, что если первый оператор if верен, то ответом является Sucess, в противном случае это ошибка без изменения типов Success или Failed.

Попробуйте ссылку

1 Ответ

0 голосов
/ 10 мая 2018

Это не возможно так, как вы хотели бы. Вот пример обсуждения того, что вы хотите на GitHub.

То, что вы предоставили выше, на самом деле не является непересекающимся союзом, это просто союз. Использование общей опоры, которая различает эти два, было бы непересекающимся объединением, и там можно сделать уточнение типа. Вот вам Попробуйте ссылку .

...