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

Relaterade artiklar