如何在打字稿中使用空位合并

时间:2019-11-15 12:19:10

标签: javascript typescript

随着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"); 
}

??的索引为index11的索引为index0时,为什么0运算符的行为会有所不同。两者都应返回false,因为它是!== -1

游乐场link

2 个答案:

答案 0 :(得分:6)

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

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");
}

奇怪的是,虽然the proposal中提到的优先级为the draft spec,但Jonas mentions中确实提到了the issues中没有讨论的优先级。

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

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)}`);

根据规范草案,??的优先级比||低(大概 低)。 (为避免混淆,在&&||表达式中也不允许这样做。)

答案 1 :(得分:3)

引用draft

  

??优先级低于||

换句话说,您的代码的行为大致类似于:

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

这将被视为:

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