【发布时间】:2020-08-20 01:52:27
【问题描述】:
我在打字稿中遇到了类型问题。
所以我有一个从一些复选框中获得的 som ID 数组。这个数组也可以是空的。
可从 submit() 返回的值示例:
const responseFromSubmit = {
1: {
id: "1",
value: "true"
},
2: {
id: "2",
value: "false"
},
3: {
id: "3",
value: "false"
}
};
const Ids: number[] = Object.values(submit()!)
.map(formfield => {
if (formfield.value === 'true') {
return Number(formfield.id);
}
})
.filter(id => id != undefined);
所以在这种情况下,ID 将是 Ids = [1]。
我尝试了几种解决方案,例如通过检查 Ids 是否未定义来尝试在上面的代码块之后更改 Ids 的值:
if (ids.length > 0){
ids = []
}
通过此代码,常量 Ids 的类型为 (Number | undefined)[],我怎样才能使其始终为 number[] 类型,即使它为空?
这是一个解决方案,但我一点也不喜欢:
const Ids: number[] = Object.values(submit()!)
.map(formfield => {
if (formfield.value === 'true') {
return Number(formfield.id);
} else {
return 0;
}
})
.filter(id => id != 0);
在我的情况下,formfield.id 永远不会有值 0,因此可以过滤所有值为 0 的元素。所以我不推荐这个解决方案。但是,嘿,它有效,对吧? ¯\_(ツ)_/¯
【问题讨论】:
-
问题是
.filter不能改变数组的类型。这是有道理的,比如说,你有arr = [1, 2, "a", "b", 3],即(number | string)[]。如果您执行arr.filter(x => x !== "a"),那与arr.filter(x => typeof x === "number")的操作(签名方式)相同。 TS 无法推断出一个过滤器会产生number[]而另一个不会。它需要检查代码,并且可能能够进行比这更高级的分析。 -
submit()是什么? -
submit() 是我制作的一个函数,它从表单返回值。在这种情况下,它会返回复选框中的所有值 :)
-
0的情况呢?你也想过滤掉吗?
标签: javascript arrays typescript array.prototype.map