Попытка сделать то же самое, что и Ввод функции mapShape в TypeScript , но для Flow.
Я хочу использовать служебную функцию, подобную этой:
const out = mapShape(
{ foo: 1, bar: '2', baz: 'hello' },
{ foo: x => String(x), bar: x => parseInt(x) }
)
// outputs { foo: '1', bar: 2 }
Есть ли способ параметризовать его в Flow, чтобы он проверял типы аргументов функции преобразования, и тип выходных данных был бы таким?
{ foo: string, bar: number }
Я пытался сделать это:
export default function mapShape<I: Object, T: $ObjMapi<I, <K, V>(K, V) => (V, K, I) => any>>(
obj: I,
mapper: T
): $ObjMap<T, <V>(() => V) => V> {
const result: any = {}
for (const key in mapper) {
if (Object.hasOwnProperty.call(mapper, key)) {
result[key] = (mapper[key] as any)(obj[key], key, obj)
}
}
return result
}
Flow выводит правильный тип вывода, но не вызывает желаемых ошибок в функциях отображения, например:
mapShape(
{
foo: 1,
bar: '2',
baz: 'hello',
},
{
foo: x => String(x),
bar: (x: number) => parseInt(x),
// ^^^^^^
// Flow doesn't error that this is the wrong argument type
}
)