Как ввести функцию с входными и выходными объектами с одинаковыми ключами, но разными типами значений?

По сути, у меня есть функция, которая преобразует объект в другой объект, и она похожа на словарь, но я не знаю, как ее ввести.

var myFunctions = {
  a: () => something1,
  b: () => something2,
  [...]
}

превращается в

var myObject = {
  a: something1,
  b: something2
  [...]
}

person kakigoori    schedule 09.03.2016    source источник


Ответы (3)


С Flow 0.33+ вы можете использовать $ObjMap

type ExtractCodomain = <V>(v: () => V) => V;
declare function f<O>(o: O): $ObjMap<O, ExtractCodomain>;
person gcanti    schedule 01.10.2016

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

function<T>(obj: T): ([key: $Keys<T>]: boolean)

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

Обратите внимание, что функция $Keys недокументирована, поскольку она не является частью общедоступного API, поэтому ее поведение определяется исключительно ее реализацией (другими словами, она может измениться в любое время).

Если вас интересуют подробности системы типов Flow, ознакомьтесь с типами, которые поставляются с потоком в его собственном каталоге /lib, например https://github.com/facebook/flow/blob/master/lib/core.js — вы увидите, что некоторые вещи, такие как Object.assign, являются особенными. case, поэтому вы не сможете повторно реализовать такие вещи в своем собственном коде.

Также посетите http://sitr.us/2015/05/31/advanced-features-in-flow.html для других «долларовых функций», таких как $Shape и $Diff — он частично устарел, но может дать несколько полезных указаний.

person Nikita    schedule 21.03.2016

@Nikita дал вам лучший ответ на данный момент. Тем не менее, вариант использования, о котором вы говорили, обсуждается в проблемах репозитория FlowType. Может скоро приземлиться.

На данный момент, если у вас смешанный тип, я просто вернусь к any.

function<T>(obj: T): ([key: $Keys<T>]: any)

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

person Naman Goel    schedule 14.07.2016