为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Typescript 中使用 Nullish Coalescing

如何在 Typescript 中使用 Nullish Coalescing

凤凰求蛊 2022-01-01 20:44:08
随着 Typescript 3.7 的发布,现在支持Nullish Coalescing。但是,我似乎错误地使用了它.. 我有以下结构:type myType = { ["myKeys"]?: Array<string> }let data: myType;data = {};data["myKeys"] = ["index0"];console.log(data?.["myKeys"]?.indexOf("index0")) // 0 if (data?.["myKeys"]?.indexOf("index0") ?? -1 === -1) { // returns false} else {    console.log("returns false");}data["myKeys"].push("index1")console.log(data?.["myKeys"]?.indexOf("index1")) // 1if (data?.["myKeys"]?.indexOf("index1") ?? -1 === -1) { // returns true - why?    console.log("Why is it true"); }为什么??当索引为index1is1而索引为index0is时运算符的行为不同0。两者都应该返回 false,因为它是!== -1
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

这是一个优先级问题。您的代码被评估为:


if (data?.["myKeys"]?.indexOf("index1") ?? (-1 === -1)) {

// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^−−−−−−−−−^

    console.log("Why is it true");

}

但你的意图是:


if ((data?.["myKeys"]?.indexOf("index1") ?? -1) === -1) {

// −^−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^

    console.log("Why is it true");

}

奇怪的是,我没有看到提案中讨论的优先级,尽管它在规范草案中如乔纳斯提到的那样被提及,并且它确实出现在问题中。


如您所见,这与 的优先级一致||,这是它的非常非常近的亲戚:


const a = 2;

const b = -1;

console.log(`${a} || ${b} === ${b}:   ${a || b === b}`);

console.log(`(${a} || ${b}) === ${b}: ${(a || b) === b}`);

console.log(`${a} || (${b} === ${b}): ${a || (b === b)}`);


根据草案规范,??优先级低于||(大概只是更低)。(为避免混淆,也不允许在&&or||表达式中。)


查看完整回答
反对 回复 2022-01-01
?
慕标5832272

TA贡献1966条经验 获得超4个赞

引用草稿

?? 具有比 || 低的优先级

或者换句话说,您的代码的行为大致如下:

  data?.["myKeys"]?.indexOf("index0") || -1 === -1

这将被视为:

 (data?.["myKeys"]?.indexOf("index0")) || (-1 === -1)


查看完整回答
反对 回复 2022-01-01
  • 2 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信