Массив как в случае переключателя JavaScript - PullRequest
1 голос
/ 27 мая 2020

Как я могу использовать массив в качестве параметра case в case case?

switch ("value")
  case ArrayOfStrings // check every array item to be match with value
    ...

Ответы [ 3 ]

3 голосов
/ 27 мая 2020

No.

Это

switch ("value") {
  case ArrayOfStrings // check every array item to be match with value
    ...

не работает, потому что значение switch и значение case проверяется с помощью оператора идентичности / строгого равенства === сравнения.

Невозможно проверить значение по значению массива.

Любое другое конструкция, например

switch (true) {
  case ArrayOfStrings.includes("value"):  // check every array item to be match with value

, будет работать, но если вам нужно проверить только одно значение, а не другие ограничения, вам лучше взять

if (ArrayOfStrings.includes("value")) {
    // ...
}
0 голосов
/ 27 мая 2020

Теоретически вы можете сделать это, чтобы различать guish между разными конструкторами.

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'

Однако этот метод имеет ограничения .

  1. Это не работает с подклассами.
  2. input будет одного типа для каждого case - в отличие от дискриминации. См. TypeScript Playground .
  3. Вам необходимо создавать массивы с помощью ключевого слова new.

Лучше использовать операторы if в сочетании с типом вместо этого охранники.

0 голосов
/ 27 мая 2020

Ну, сначала я бы предложил использовать if с чем-то вроде Array.isArray:

if (Array.isArray(value)) {
  // check array items
}

Но, если вы действительно хотите / вам нужно проверить, сравнивая с Array конструктором:

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'

Я бы действительно не рекомендовал использовать этот подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...