【发布时间】:2021-10-20 04:50:45
【问题描述】:
我正在尝试编写这段代码,如果属性不存在,则从具有默认值的对象数组中提取布尔值
const flagArrayToBooleanArray_INITIAL_ERROR = (
arr: Array<{ value: string } | { value: string; flag: true }> = [{
value: "",
}, { value: "", flag: true }],
) => {
const flags: Array<boolean> = arr.map((obj) => obj.flag ?? false);
return flags;
};
}
Typescript 抱怨函数 ({ flag }) => flag ?? false 因为属性 flag 在类型 Empty | { flag: true } 上不存在
这可以通过将对象转换为地图来解决
function flagArrayToBooleanArrayFixedMap(
arr: Array<{ value: string } | { value: string; flag: true }> = [{ value: "" }, { value: "", flag: true }],
) {
return arr.map((obj) => {
const tmp = new Map(Object.entries(obj));
return tmp.get("flag") === true ? true : false;
});
}
有没有办法告诉打字稿I know this might not exist, I want the default js behaviour in this case?
编辑:修复了一些复制粘贴错误,在初始代码中没有编译器错误。
【问题讨论】:
-
@T.J.Crowder 它工作,但如果你从
const flags: Array<boolean>中去掉硬输入,编译器认为flags是true[]。如此有效,但很时髦(如果有flag属性,它必须是真的,所以映射的结果是true[])。 -
@T.J.Crowder 如果您将鼠标悬停在
.map上。具体或者去掉flags的类型,可以看到是true[]。由于.map专门迭代{ flag },并且具有flag属性的项目都是true,因此?? false永远不会发挥作用,除非你对编译器撒谎. -
@crashmstr - 看到了吗?我很密集。 :-D 你说,就在你之前的评论中。这似乎不是 OP 所要求的,但它确实需要修复。
-
@T.J.Crowder,谢谢你的建议,以后我会尽量多在场,
-
@afiori - 谢谢。您可以编辑问题以更正或扩展它。 (这样做时,重要的是要小心不要使现有答案无效或合并现有答案。)
标签: javascript typescript typeerror