javascript - Hvordan bruke Nullish Coalescing i Typescript
Med utgivelsen av Typescript 3.7 er det nå støtte for Nullish Coalescing. Det ser imidlertid ut til at jeg bruker det feil.. Jeg har følgende struktur:
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");
}
Hvorfor oppfører ??-operatoren seg annerledes når indeksen til index1 er 1 mens indeksen til index0 er 0. Begge burde returnere false siden det er !== -1
Lekerom lenke
Svar #1
Det er et prioriteringsproblem. Koden din blir evaluert som:
if (data?.["myKeys"]?.indexOf("index1") ?? (-1 === -1)) {
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^−−−−−−−−−^
console.log("Why is it true");
}
men din intensjon er:
if ((data?.["myKeys"]?.indexOf("index1") ?? -1) === -1) {
// −^−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^
console.log("Why is it true");
}
Merkelig nok ser jeg ikke at presedens blir diskutert i forslaget, selv om det nevnes i utkastet til spesifikasjon som Jonas nevner, og det dukker opp i problemene.
Som du kan se, er dette i samsvar med prioriteten til ||, som er dens veldig, veldig nære slektning:
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)}`);Ifølge utkastspesifikasjonen har ?? lavere presedens enn || (antagelig bare lavere). (For å unngå forvirring er det heller ikke tillatt i et && eller ||-uttrykk.)
Svar #2
For å sitere fra utkastet:
?? har lavere presedens enn ||
Eller med andre ord, koden din oppfører seg omtrent slik:
data?.["myKeys"]?.indexOf("index0") || -1 === -1
Og det vil bli behandlet som:
(data?.["myKeys"]?.indexOf("index0")) || (-1 === -1)
