javascript - Varför ger typescript ett fel vid jämförelse mellan number | undefined, även efter att ha använt valfri kedjning?
Nedan är kodblocket som jag har där TypeScript kommer att kasta ett fel på den andra if-satsen och säga att Object kan vara undefined. I så fall, borde inte TypeScript bara anta att det är falskt när a är undefined och inte kasta ett fel?
const condition = true; // can be a condition that could be either true or false
const a: Array<number> | undefined;
if(condition) {
a = [1,2,3,4,5];
}
if(a?.length > 0){
// Have some code
}
Här är en länk till kodblocket och felet som kastas. https://www.typescriptlang.org/play?#code/MYewdgzgLgBKYBMCWUngFwCMQgDYFMBDMGAXhigCcBXfAbgFgAoA2Q9GAQUssIE8APGGoBbTPkoA+GAB8Y1RPgBmSMPgSMmSJQAp4yVOACUMAN7MYMQmRgBtAIwAaAEyOAzI4AsAXU0BfZmZtHUIAfgA6AjAAcygACxhpAAYTcyZLAHoMmAAJQgA3fBgIEBEi0AR8Zj8gA
Eller är det att vi försöker göra en undefined > 0 odefinierad jämförelse med ett nummer, det är anledningen till att det kastar ett fel?
Svar #1
Eller är det att vi försöker göra en odefinierad > 0 odefinierad jämförelse med ett tal, är det anledningen till att det kastar ett fel?
Precis så. För ett annat exempel som resulterar i exakt samma fel, se:
const undef = void 0;
if (undef > 0) {
// Have some code
}
Inget att göra med ditt Array<number> | undefined i synnerhet eller den valfria kedjningen - det är att TypeScript inte låter dig jämföra något som kanske inte är definierat mot ett tal, eftersom jämförelsen inte är särskilt meningsfull. I ett sådant fall, där arrayen inte är definierad, skulle du förvänta dig
if (a?.length > 0) {
att bli uppfylld, eller inte? Eller är du inte helt säker? Om du är osäker, som många förmodligen skulle vara utan att först köra koden för att se vad den resulterar i, är det poängen bakom detta TypeScript-fel - koden är förvirrande, så TS uppmanar dig att fixa det.
