【问题标题】:Check if variable belongs to custom type in Typescript检查变量是否属于 Typescript 中的自定义类型
【发布时间】:2019-01-11 13:33:44
【问题描述】:

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

代码:

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 的每个可能值?

【问题讨论】:

  • 也许this answer 有用
  • 打字稿在 runetime 中不存在。您可以使用类而不是类型。但类型是纯 ts。没办法,这是不可能的。但是您可以使用一些判别式创建类型,然后在此判别式上使用 switch case,打字稿将能够缩小当前类型

标签: typescript types instanceof


【解决方案1】:

正如 cmets 中所述,似乎没有直接的方法可以实现这一目标。

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

更详细的解释可以找到here

【讨论】:

  • 我希望有一种更优雅、更简洁的方法来做到这一点,例如在 if 语句中断言类型而不使用辅助函数。
【解决方案2】:

类型保护通常用于区分工会。有更多方法可以做到这一点:

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

如您所见,编写类型保护需要更多的前期工作,但类型保护没有其他方法的限制。除此之外,它们只是函数,因此可以重复使用。你做了一个不错的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 2022-01-25
    • 2020-07-17
    • 2021-04-21
    • 2010-12-25
    • 2022-01-08
    • 2011-01-13
    • 2021-10-07
    相关资源
    最近更新 更多