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)

Relaterte artikler