Безопасное литье смешанного типа в подходящий тип с потоком - PullRequest
0 голосов
/ 27 февраля 2019

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

static convertSingleSafe<T: (number | boolean | string | void)>(
        data: {[string]: mixed},
        name: string,
        type: 'number' | 'boolean' | 'string' | 'object' | 'undefined'): T {
    if (typeof data[name] === type ) {
        return data[name]
    } else  {
        throw new KeyError(`Badly formated value ${name}`, '')
    }
}

, которая будет называться как:

const data: {[string]: mixed} = {val: 10, otherdata: 'test'};
//data would come from IE JSON.parse() of a request to server.
const val: number = convertSingleSafe<number>(data, 'val', 'number');
const msg: string = convertSingleSafe<string>(data, 'otherdata', 'string);

Проблема, однако, в том, что поток, кажется, не понимаетутверждения в функции convertSingleSafe.На return data[name] отображается следующая ошибка:

Ошибка: (82, 20) Невозможно вернуть data[name], поскольку: либо смешанный [1] несовместим с числом [2].Или смешанный [1] несовместим с логическим [3].Или смешанный [1] несовместим со строкой [4].

Несмотря на то, что я довольно явно проверяю значение для этого конкретного.


Другой вариант, чтобы позволитьgeneric be является частью типа данных и выдает следующую ошибку:
static convertSingleSafe<T: (number | boolean | string | void)>(
        data: {[string]: T},
        name: string,
        type: 'number' | 'boolean' | 'string' | 'object' | 'undefined'): T

Ошибка: (191, 41) Невозможно вызвать FlowTest.convertSingleSafe с d, связанным с data, поскольку в свойстве индексатора: Любая смешанная [1] несовместима с числом [2].Или смешанный [1] несовместим с логическим [3].Или смешанный [1] несовместим со строкой [4].

Так (как) я могу это сделать, не проходя any приведений?

1 Ответ

0 голосов
/ 28 февраля 2019

Что вам нужно понять о уточнении типа в потоке, так это то, что он не очень умен.Flow в основном ищет такую ​​конструкцию, как typeof <something> === 'number', например, представьте, что он использует регулярные выражения для сканирования вашего кода (на самом деле это не так). Вот пример, который делает то, что я думаю, что вы хотите:

static convertSingleSafe(
  data: {[string]: mixed},
  name: string,
  type: 'number' | 'boolean' | 'string' | 'object' | 'undefined'
): number | boolean | string | {} | void {
  const subject = data[name];
  if (type === 'number' && typeof subject === 'number') {
    return subject;
  }
  if (type === 'boolean' && typeof subject === 'boolean') {
    return subject;
  }
  if (type === 'string' && typeof subject === 'string') {
    return subject;
  }
  if (type === 'undefined' && typeof subject === 'undefined') {
    return subject;
  }
  if (type === 'object' && subject && typeof subject === 'object') {
    return subject;
  }
  throw new KeyError(`Badly formated value ${name}`, '');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...