在 Flow 中声明一个通用形状的对象
Posted
技术标签:
【中文标题】在 Flow 中声明一个通用形状的对象【英文标题】:Declare an object of generic shape in Flow 【发布时间】:2019-08-16 15:29:55 【问题描述】:考虑一个函数:
const f = k => v => array =>
array.reduce(
(total, current) => (
...total,
[current[k]]: current[v]
),
);
这个函数接受键k
,值v
,然后是一个对象数组作为输入,并返回一个类似映射的对象,其中键和值取自键k
和值@987654325的值@。例如,
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
到目前为止,我在这一点上:
const f = <K>(k: K) => <V>(v: V) => (array: Array< [k]: K, [v]: V >) =>
array.reduce(
(total, current) => (
...total,
[current[k]]: current[v]
),
);
这在技术上是有效的流语法,但给了我一个错误:
1: const f = <K>(k: K) => <V>(v: V) => (array: Array< [k]: K, [v]: V >) =>
^ Cannot use `K` as a type because `K` is a value. To get the type of a value use `typeof`
如何声明一个派生自先前声明的泛型类型的形状对象的类型?这在 Flow 中可行吗?
【问题讨论】:
【参考方案1】: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
的值。
【讨论】:
以上是关于在 Flow 中声明一个通用形状的对象的主要内容,如果未能解决你的问题,请参考以下文章
TestBed configureTestingModule 在一个模块中定义所有 spec.ts 通用的导入、声明、提供程序和管道 - 模式