在Flow中声明一个通用形状的对象

时间:2019-03-26 09:41:09

标签: javascript flowtype static-typing

考虑一个功能:

const f = k => v => array =>
  array.reduce(
    (total, current) => ({
      ...total,
      [current[k]]: current[v]
    }),
    {}
  );

此函数将键k,值v和一个对象数组作为输入,并返回一个类似地图的对象,其中键和值取自键{{1 }}和值k。例如,

v

我正在努力声明数组中对象的类型。它们必须具有两个属性,但是这些属性不是静态的。仍然可以从const k = 'key'; const v = 'value'; const input = [{ key: 1, value: 100 }, { key: 2, value: 200 }, { key: 3, value: 300 }]; f(k)(v)(input); // -> { '1': 100, '2': 200, '3': 300 } 之前的kv派生它们。 array中的每个对象都应具有类似

的形状
array

到目前为止,我在这里:

const k = 'key';
const v = 'value';
{ [k]: 123, [v]: 456 }; // -> { 'key': 123, 'value': 456 }

这在技术上是有效的Flow语法,但给我一个错误:

const f = <K>(k: K) => <V>(v: V) => (array: Array<{ [k]: K, [v]: V }>) =>
  array.reduce(
    (total, current) => ({
      ...total,
      [current[k]]: current[v]
    }),
    {}
  );

如何声明一个类型,该类型是从先前声明的泛型类型派生的形状的对象?在Flow中有可能吗?

1 个答案:

答案 0 :(得分:0)

Flow中的{ [...]: ... }语法与ES6中的含义不同。 { [k]: K, [v]: V }并不意味着对象必须具有类型k的密钥K和类型v的密钥V。相反,该语法用于表示indexer property in Flow。因此,{ [k]: K, [v]: V }无效,因为您只能指定单个索引器属性。但是,可以说我们只有{ [k]: K }。这仍然无法按预期工作,因为它将表示类型“具有键类型为k的对象映射到类型K的值。”

不幸的是,我不认为Flow当前支持您正在尝试做的事情。我认为该类型将属于dependent types,目前Flow还不支持此类型,因为数组的类型取决于kv的值。