考虑一个功能:
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 }
之前的k
和v
派生它们。 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中有可能吗?
答案 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还不支持此类型,因为数组的类型取决于k
和v
的值。