使用 Object.entries 的 FlowType 错误

jam*_*non 3 flowtype

所以,我有以下代码,但流程错误不断弹出。我试过投射 Object.entries,但不起作用 - 其他东西。任何见解?

type Fields = {
  name: string,
  func: (*) => boolean
};

type S = {
  key1: Fields,
  bill: Fields
}

var a: S = {
  key1: {name: 'mary', func: (str) => str === 'mary'},
  bill: {name: 'bill', func: (str) => str === 'bill'}
}

var c = Object
  .entries(a)
  .map(([key, obj]) => obj.func(key) ? obj : false)
  .filter(f => f)
  .reduce((acc, c) => {
    return 'something here'
   }, {});
Run Code Online (Sandbox Code Playgroud)

我已经省略了一些东西,但速度是一样的。Flow 正在读取这些条目作为返回元组类型。我尝试了各种各样的事情,但我没有把事情搞砸,而是保持原样。

我似乎无法在这里注释解构的项目 ([key, obj]),得到元组错误...

将代码分配给 var c、使用注释等有什么帮助吗?

我得到的错误:无法调用混合类型的方法(来自 obj.func)无法在元组等中分配值。

log*_*yth 6

错误是准确的。Object.entries有类型

条目(对象:任何):数组<[字符串,混合]>;

它无法知道元组中第二项的类型是什么。这意味着你的代码

.map(([key, obj]) => obj.func(key) ? obj : false)
Run Code Online (Sandbox Code Playgroud)

需要做

.map(([key, obj]) => {
    if (typeof obj.func !== 'function') throw new Error();
    return obj.func(key) ? obj : false;
})
Run Code Online (Sandbox Code Playgroud)

这样 flow 就知道它肯定是一个函数。

或者,您可以更改数据结构以使用元组中第二项具有保证类型的类型Map,例如

type Fields = {
  name: string,
  func: (string) => boolean
};

type S = Map<string, Fields>;

var a: S = new Map([
  ['key1', {name: 'mary', func: (str) => str === 'mary'}],
  ['bill', {name: 'bill', func: (str) => str === 'bill'}],
]);

var c = Array.from(a, ([key, obj]) => obj.func(key) ? obj : false)
  .filter(f => f)
  .reduce((acc, c) => {
    return 'something here'
   }, {});
Run Code Online (Sandbox Code Playgroud)