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

Check if variable belongs to custom type in Typescript

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

代码:

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?

的每个可能值

如评论中所述,似乎没有简单的方法可以实现这一点。

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

如您所见,编写类型保护需要更多的前期工作,但类型保护没有其他方法所具有的限制。除此之外,它们只是函数,所以它们可以被重用。你选对了。