我有这样的类型:
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]
转换为字符串 与字符串不兼容
关于如何解决此问题的任何想法?谢谢!
答案 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;
});
或像这样entry
向entry: [string, any]
添加类型,但请注意使用 any
是完全不安全的,应尽可能避免。< / strong>)
答案 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
但是,如果我建议使用可读性更高的代码来达到相同的结果:
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