流允许与object.entries和字符串连接

时间:2019-06-06 21:49:21

标签: javascript flowtype

我有这样的类型:

type Cool = {
    [key: string]: number
}

现在,假设我有一个具有该类型的对象:

let my: Cool = {
    "asdf": 1,
    "jkl": 2
}

运行Object.entries(my)时,我得到[["asdf", 1], ["jkl", 2]]。这似乎很正常。但是,我想将每个键组合成一个字符串,如下所示:

let mystring = "";
Object.entries(my).forEach(entry => {
    mystring = entry[1] + mystring;
});

我希望mystring等于“ jklasdf”,并且确实如此。但是,在mystring = ...行上出现流错误。错误状态:

  

由于混合[1],因此无法将Object.entries(...)[0][1]转换为字符串   与字符串不兼容

关于如何解决此问题的任何想法?谢谢!

2 个答案:

答案 0 :(得分:4)

Object.entries键入为:

  

静态条目(对象:$ NotNullOrVoid):数组<[字符串,混合]>

当您尝试使用mixed类型的值时,必须首先弄清楚实际类型是什么,否则最终会出错,因此可以使用Flow的type refinement

Object.entries(my).forEach(entry => {
  if (typeof entry[1] === 'number') {
    mystring = entry[1] + mystring;
  }
});

您也可以只投放entry[1]

Object.entries(my).forEach(entry => {
  mystring = Number(entry[1]) + mystring;
});

或像这样entryentry: [string, any]添加类型,但请注意使用 any 是完全不安全的,应尽可能避免。< / strong>)

DEMO

答案 1 :(得分:0)

您的问题出在算法上,而不是类型上。

首先,如果您希望mystring等于"jklasdf",则需要像[0]这样访问第一个索引entry[0],因为数组是对象的关键,如果这正是您想要的。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries

  

Object.entries()方法返回给定对象自己的可枚举字符串键属性[key,value]对的数组...

因此,无论类型如何,您的代码都应该

let my = {
    "asdf": 1,
    "jkl": 2
}

let mystring = "";
Object.entries(my).forEach(entry => {
    mystring = entry[0] + mystring;
});

console.log(mystring);
// jklasdf

因此,现在您的流类型根本没有问题。 https://flow.org/try/#0C4TwDgpgBAwg9nANlAvFA3gKCjqBtAawhAC4oBnYAJwEsA7AcwF0y6BXAWwCMIrMBfTJkQRgUDqVgJkaLLigAiAIbkAJgDMFZAIwAabLgUArAoi1QATAKEixEyrUapFCgNyYA8lyMQAxsAA6CDpqGghyAAoJAEoA9TgqAFElXwALCODqEFQAPgwDHHtQpzRMqhA8AAYmKABqcRAHegZ3fmjXIA

但是,如果我建议使用可读性更高的代码来达到相同的结果:

let my = {
    "asdf": 1,
    "jkl": 2
}

let mystring = "";
   
for (const [key, value] of Object.entries(my)) {
    mystring = [key, ...mystring].join('')
}

console.log(mystring);
// jklasdf

或使用Array.prototype.reduce

let my = {
    "asdf": 1,
    "jkl": 2
}

const mystring = Object.entries(my)
                    .reduce((result, [key, value]) => {
                        return result = [key, ...result].join('');
                    }, "");

console.log(mystring);
// jklasdf