How can I use an array as case parameter in switch case?
switch ("value")
case ArrayOfStrings // check every array item to be match with value
...
How can I use an array as case parameter in switch case?
switch ("value")
case ArrayOfStrings // check every array item to be match with value
...
No.
This
switch ("value") {
case ArrayOfStrings // check every array item to be match with value
...
does not work, because the value of switch
and the value of case
is checked with a Identity/strict equality operator ===
comparison.
It is not possible to check a value agains a value of the array.
Any other construction, like
switch (true) {
case ArrayOfStrings.includes("value"): // check every array item to be match with value
would work, but if you have only to check a single value and not other constraints, you better take
if (ArrayOfStrings.includes("value")) {
// ...
}
Well first I would suggest using if
with something like Array.isArray
:
if (Array.isArray(value)) {
// check array items
}
But, if you really want/need to check by comparing to Array
constructor:
const check = (value) => {
switch (value.constructor) {
case Array:
console.log('array');
break;
// For example
case Number:
console.log('number');
break;
}
}
check(7); // 'number'
check([]); // 'array'
I would really discourage from using this approach though.
In theory, you could do that to distinguish between different constructors.
class ArrayOfStrings extends Array<string> {};
class ArrayOfNumbers extends Array<number> {};
function main(input: ArrayOfStrings | ArrayOfNumbers): void {
switch (input.constructor) {
case ArrayOfStrings:
console.log('It was an array of strings!');
break;
default:
console.log('It was something else');
}
}
main(new ArrayOfStrings('foo', 'bar')); // Logs 'It was an array of strings!'
main(new ArrayOfNumbers(1, 2)); // Logs 'It was something else'
However, this method has limitations.
input
will be of the same type for each case
— as opposed to being discriminated. See TypeScript Playground.new
keyword.It's better to use if
statements combined with type guards instead.