在 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 

我正在努力在数组中声明对象的类型。它们必须有两个属性,但这些属性不是静态的。不过,它们可以从kv 派生而来,位于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 类型的键 kV 类型的键 v。相反,该语法用于表示indexer property in Flow。因此, [k]: K, [v]: V 无效,因为您只能指定一个索引器属性。但是,假设我们只有 [k]: K 。这仍然无法按预期工作,因为这将表示类型“具有k 类型键的对象映射到K 类型的值。”

很遗憾,我认为 Flow 目前不支持您尝试执行的操作。我相信这种类型会属于dependent types,目前Flow不支持,因为数组的类型取决于kv的值。

【讨论】:

以上是关于在 Flow 中声明一个通用形状的对象的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow(4) 张量属性:维数、形状、数据类型

如何在协议中声明通用协议属性要求

IfcFeatureElementAddition

TestBed configureTestingModule 在一个模块中定义所有 spec.ts 通用的导入、声明、提供程序和管道 - 模式

在 C# 中:如何声明一个类型为键的通用字典,该类型的 IEnumerable<> 作为值?

OkHttp初探2:如何使用OkHttp进行下载封装?带进度条?Kotlin+Flow版本。