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

TypeScript: how to type guard union type

函数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 | Link[]' 类型的参数不可分配给 'Link'

类型的参数

这个错误是可以理解的,因为映射器获取一个联合类型作为其参数,但只需要一个对象。这不是我在使用类型保护时所希望的。对此有什么想法吗?

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