Typescript: Typen "boolean" kan inte jämföras med typen "number"
Jag måste missa något. Jag har den här funktionen:
transform(value: number): string {
switch (value) {
case value > 1 && value < 86400:
return 'this';
break;
case value > 86401 && value < 259200:
return 'that';
break;
}
}
När jag försöker kompilera det får jag dessa fel:
ERROR in src/app/time-transform.pipe.ts:10:12 - error TS2678: Type 'boolean' is not comparable to type 'number'.
10 case value > 1 && value < 86400:
~~~~~~~~~~~~~~~~~~~~~~~~~~
src/app/time-transform.pipe.ts:13:12 - error TS2678: Type 'boolean' is not comparable to type 'number'.
13 case value > 86401 && value < 259200:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jag vill kunna jämföra siffror. Vad saknar jag här?
Svar #1
Detta beror på att switch/case använder strikt jämförelse, dvs. ===, och du jämför value, som är ett tal, mot ett uttryck, t.ex. value > 1 && value < 86400 som utvärderas som boolean.
Du bör använda if/else-satser istället. Observera att din switch/case-kod inte har en standard return, vilket ändå kommer att ge ett fel: du kommer ändå behöva hantera fall där value <= 1 och value >= 259200:
transform(value: number): string {
if (value > 1 && value < 86400) {
return 'this';
} else if (value > 86401 && value < 259200) {
return 'that';
} else {
return 'something else';
}
}
Svar #2
För tydlighetens skull. Det finns två olika element i en switch/case som kommer att jämföras. Det första elementet är det du skrev efter nyckelordet 'switch' inom parentesen (vilket är ett nummer i ditt fall). Det andra elementet är de element som du skrev efter nyckelorden 'case', vilka är villkorssatser i ditt fall. Därför kommer dessa satsers resultat alltid att vara booleaner efter att de har parserats. Detta betyder att du i slutändan vill jämföra ett nummer med en boolean. Resultatet av denna jämförelse är alltid falskt på grund av den strikt jämförelse som används av switch/case.
switch (value) { // <-- First member of comparison (number)
case value > 1 && value < 86400: /* <-- Second member of comparison
which will be a boolean after parsing it */
return 'this';
break;
}
/* Well you are trying to do that: 3 === true,
but this is always false because of the strict comparison (===) */En möjlig lösning (inte riktigt vacker lösning):
switch (true) { /* Use 'true' as the first member of the comparison
and your code will be executed in those case
when the condition evaluation is true in the 'case' block */
case value > 1 && value < 86400:
return 'this';
break;
}