猿问

如何在 Typescript 中使用 Nullish Coalescing

随着 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")) // 1


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

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

}

为什么??当索引为index1is1而索引为index0is时运算符的行为不同0。两者都应该返回 false,因为它是!== -1


凤凰求蛊
浏览 174回答 2
2回答

大话西游666

这是一个优先级问题。您的代码被评估为:if (data?.["myKeys"]?.indexOf("index1") ?? (-1 === -1)) {// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^−−−−−−−−−^&nbsp; &nbsp; console.log("Why is it true");}但你的意图是:if ((data?.["myKeys"]?.indexOf("index1") ?? -1) === -1) {// −^−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^&nbsp; &nbsp; console.log("Why is it true");}奇怪的是,我没有看到提案中讨论的优先级,尽管它在规范草案中如乔纳斯提到的那样被提及,并且它确实出现在问题中。如您所见,这与 的优先级一致||,这是它的非常非常近的亲戚:const a = 2;const b = -1;console.log(`${a} || ${b} === ${b}:&nbsp; &nbsp;${a || b === b}`);console.log(`(${a} || ${b}) === ${b}: ${(a || b) === b}`);console.log(`${a} || (${b} === ${b}): ${a || (b === b)}`);根据草案规范,??优先级低于||(大概只是更低)。(为避免混淆,也不允许在&&or||表达式中。)

慕标5832272

引用草稿:??&nbsp;具有比 || 低的优先级或者换句话说,您的代码的行为大致如下:&nbsp;&nbsp;data?.["myKeys"]?.indexOf("index0")&nbsp;||&nbsp;-1&nbsp;===&nbsp;-1这将被视为:&nbsp;(data?.["myKeys"]?.indexOf("index0"))&nbsp;||&nbsp;(-1&nbsp;===&nbsp;-1)
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答