TypeScript:如何键入保护联合类型

时间:2015-01-07 11:43:43

标签: typescript

函数compose可以有一个对象或一个对象数组作为其参数。 在compose中,类型保护区分对象和数组。该 函数mapper只能处理对象,并且通过使用类型保护,只有对象可以使用它。

interface Link {
   something: string;
}

function compose(link: Link|Link[]) {
  if (link instanceof Array) {
    R.map(function(l) {
      return mapper(l);
    }, link);
  } else {
      return mapper(link);
  }
}

function mapper(link: Link) {
  return link;
}

编译此示例会导致错误:

错误TS2345:类型'链接|的参数链路[]'不能分配给' Link'

类型的参数

这个错误是可以理解的,因为mapper获取了一个union类型作为其参数,但只需要一个对象。这不是我在使用型号护罩时所希望的。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

似乎TypeScript 1.4.0.0并未推断link类型Link不属于类型Array时必须属于function compose(link: Link|Link[]) { if (link instanceof Array) { R.map(function(l) { return mapper(l); }, link); } else if (link instanceof Link) { return mapper(link); } } 类型。一个小的改变应该解决:

return mapper(<Link> link);

或者,您可以断言类型:

{{1}}