【问题标题】:TypeScript: how to type guard union typeTypeScript:如何输入守卫联合类型
【发布时间】:2015-01-07 11:43:43
【问题描述】:

函数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”类型的参数

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

【问题讨论】:

  • 你可以做一个 tsc --version 并报告你正在使用的版本吗?
  • 消息 TS6029:版本 1.4.0.0

标签: typescript


【解决方案1】:

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

【讨论】:

  • 我发现替代方案是最优雅的解决方案。谢谢!
  • 请注意,在.tsx 中,您必须使用link as Link
猜你喜欢
  • 1970-01-01
  • 2020-12-31
  • 2017-12-30
  • 2020-02-25
  • 2021-06-09
  • 2021-02-26
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多