将instanceof与Typescript联合类型一起使用CustomObject []

时间:2018-12-07 15:32:41

标签: angular typescript

我目前正在尝试为组件输入实现联合类型

@Input('role') role: Role | Role[];

角色在哪里

enum Role { /**/ }

但是当我稍后在代码中使用变量时

userHasRole(role: Role): boolean

if (userHasRole(this.role)) { /**/ }

由于角色是数组或单个对象,并且该方法仅允许单个对象,因此会引发错误。

要尝试解决此问题,我已将此代码包装在使用instanceof进行检查的if语句中

if (this.role instanceof Role) { 
   if (userHasRole(this.role) { /**/ }
}

但是类型检查器仍在抛出可能是数组的错误,我该如何解决呢?

我从方法调用中得到2个错误

ts2345 argument of type 'Role | Role[]' is not assignable to parameter of type 'Role'. Type 'Role[]' is not assignable to type 'Role'.

并通过检查实例

ts2359 the right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type.

1 个答案:

答案 0 :(得分:1)

您不能将instanceof表达式与enum一起使用。如果Role是一门课程,那就行了。

您可以使用Array.isArray()来检查它是数组还是单个值,TS会正确缩小控制流中的类型。

示例:

if (!Array.isArray(this.role)) {
  // In here this.role has type Role
  if (userHasRole(this.role)) { /**/ }
} else {
  // In here this.role has type Role[] so you could do something like:
  if (this.role.includes(Role.SOME_ROLE)) { /**/ }
}

PS-我认为userHasRole应该接受Role | Role[] ...