使用Object.entries

时间:2017-08-10 19:14:38

标签: 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'
   }, {});

我已经离开了一些东西,但缓慢是相同的。 Flow正在将该条目读作返回元组类型。我尝试了各种各样的事情,但是没有把事情搞砸,我没有动过。

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

有关获取分配给var c的代码,使用注释等的任何帮助。?

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

2 个答案:

答案 0 :(得分:1)

错误是准确的。 Object.entries has the type

  

entries(object:any):Array< [string,mixed]&gt ;;

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

.map(([key, obj]) => obj.func(key) ? obj : false)

需要做

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

以便流程知道它是一个函数。

或者,您可以更改数据结构以使用元组中第二项具有保证类型的类型,例如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'
   }, {});

答案 1 :(得分:1)

就我而言,我有:

    let objectsByName : { [string] : MyObjectType } = {}; //simple map
    ...
    objectsByName[object.name] = object; //call repeatedly to populate map.
    ...
    let results : any[] = []; //next we will populate this

尝试在Flow上像这样进行操作失败(尽管这是可执行的JavaScript):

    for (let [name : string, object : MyObjectType] of Object.entries(objectsByName))
    {
        let result = doSomethingWith(object); //<- error on arg
        results.push(result);
    }

这对Flow成功了:

    for (let name : string in objectsByName)
    {
        let object = objectsByName[name];
        let result = doSomethingWith(object); //<- error on arg
        results.push(result);
    }

必须更改代码结构以适应像Flow comment types这样的所谓非侵入式系统,这很烦人,我之所以选择它,是为了使我的代码完全不了解Flow的存在。在这种情况下,我必须做一个例外,并按照 Flow 的要求构造我的代码。