检查变量是否属于Typescript中的自定义类型

时间:2019-01-11 13:33:44

标签: typescript types instanceof

我正在尝试检查变量是否属于某种类型。

代码:

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 :(得分:0)

正如评论中提到的,似乎没有实现这一目标的方法。

最后,我发现最优雅的方法是使用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);
}

答案 1 :(得分:0)

类型防护通常用于区分联合。还有更多方法可以完成:

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

如您所见,编写类型保护程序需要先进行更多的工作,但是类型保护程序没有其他方法的限制。除此之外,它们只是功能,因此可以重用。您是一个不错的选择。