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