Проверьте, принадлежит ли переменная пользовательскому типу в Typescript - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь проверить, принадлежит ли переменная определенному типу или нет.

Код:

type GeneralType = SubTypeA | SubTypeB;
type SubTypeA = 'type1' | 'type2';
type SubTypeB = 'type3' | 'type4';

function someFunction(arg1: GeneralType) {
  if (arg1 instanceof SubTypeA) {
    // Do something
  }
  // Continue function
  return arg1;
}

Конечно, этот код завершается ошибкой в ​​строке 6, потому что instanceof не может использоваться для типов. Есть ли альтернативный вариант, который я мог бы использовать, не проверяя явно все возможные значения для SubTypeA?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Тип охранников обычно используются для различения профсоюзов. Есть еще несколько способов сделать это:

  1. Используйте оператор switch.
  2. Использовать перечисления.

switch оператор

Этот метод прост, но может стать громоздким, если ваши союзы большие.

function someFunction(arg1: GeneralType) {
  switch(arg1) {
      case 'type1':
      case 'type2':
        return /* */  
      default:
        /* ... */
  }
}

someFunction('type1');

Перечисления

Недостатком здесь является то, что он не работает со строковыми перечислениями, а только с обычными.

enum SubTypeA {
    type1,
    type2,
}

enum SubTypeB {
    type3,
    type4,
}

type GeneralType = SubTypeA | SubTypeB;

function someFunction(arg1: GeneralType) {
    if (arg1 in SubTypeA) {
        /* ... */
    }
}

someFunction(SubTypeA.Type1);

Как видите, для написания охраны типов требуется больше усилий, но защита типов не имеет ограничений, которые есть у других методов. Кроме того, они являются просто функциями, поэтому их можно использовать повторно. Вы сделали хороший выбор.

0 голосов
/ 11 января 2019

Как упомянуто в комментариях, кажется, нет никакого простого способа достигнуть этого.

Наконец, самый элегантный способ, который я нашел, это использовать Type Guards следующим образом:

type GeneralType = SubTypeA | SubTypeB;
type SubTypeA = 'type1' | 'type2';
type SubTypeB = 'type3' | 'type4';

function someFunction(arg1: GeneralType) {
  if (isSubTypeA(arg1)) {
    // Do something
  }
  // Continue function
}

function isSubTypeA(arg: GeneralType): arg is SubTypeA {
  return ['type1', 'type2'].some(element => element === arg);
}
...