8

I must be missing something. I have this function:

  transform(value: number): string {
    switch (value) {
      case value > 1 && value < 86400:
        return 'this';
        break;
      case value > 86401 && value <  259200:
        return 'that';
        break;
    }
  }

When I try to compile it, I get these errors:

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:
              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

I want to be able to compare numbers. What am I missing here?

0

3 Answers 3

10

That is because for switch/case uses strict comparison, i.e. ===, and you are comparing value, which is a number, against an expression, e.g. value > 1 && value < 86400 that is evaluated as boolean.

You should be using if/else statements instead. Note that your switch/case code does not have a default return, which will throw an error anyway: you will need to catch causes where value <= 1 and value >= 259200 anyway:

transform(value: number): string {
    if (value > 1 && value < 86400) {
        return 'this';
    } else if (value > 86401 && value < 259200) {
        return 'that';
    } else {
        return 'something else';
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

You can also change switch(value) to switch(true) if he wants to stay with the switch: repl.it/repls/WoefulHospitableMalware
8

For the sake of clarity. There are two different elements in a switch/case which will be compared. The first element is what you wrote after the 'switch' keyword in the in parentheses (which is a number in your case). The second element are those elements that you wrote after the 'case' keywords which are conditional statements in your case. Therefore these statements' result will be always boolean after parsing them. This means you want to compare a number to a boolean eventually. Well, the result of this comparison is always false because of the strict comparison used by 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 (===)       */

A possible workaround (not really beautiful solution):

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

Comments

0

This is probably a bad idea but you can convert this:

   const r = Math.random()

   if (r < 0.10) {
      //
    }
    else if (r < 0.20) {
      //
    }
    else if (r < 0.60) {
      //
    }
    else {
      //
    }

to this:

const r = Math.random();

switch(true) {

   case r < 0.10:
      break;
   case r < 0.20:
      break;
   case r < 0.60:
     break;
   default:


}

thanks to @Sebastian's comment on the other answer.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.