我想了解一下我在Typescript /Angular 中看到的一个特殊图案,它是:

this.subscription = this.router.events
    .pipe(
        filter((routingEvent: any): routingEvent is NavigationEnd => routingEvent instanceof NavigationEnd),

据我所知,"is"这个关键字的范围缩小到了type.这意味着Angular's RouterEvent类变成了它的子类NavigationEnd.然后,我们判断routingEvent是否属于实例NavigationEnd.我有两个问题:

  • 如果我们使用‘map()’,比方说routingEvent is NavigationEnd,效率不是更高吗?
  • filter()年,我们说的是routingEvent is NavigationEnd.这会改变我们订阅时的输出吗?如果是这样的话,为什么我们不能只有return true,因为我们刚刚宣布了routingEvent is NavigationEnd呢?

如果这些问题有缺陷,请原谅我,因为我是打字新手,但如果有人能帮助我,那就太好了.

推荐答案

据我所知,"is"关键字缩小了一种类型的范围.这意味着ANGLE的RouterEvent类变成了它的子类NavigationEnd.

是的,但只有当函数返回true时.routingEvent is NavigationEnd意味着"我将返回一个布尔值,如果我返回true,typescript应该假设事件是NavigationEnd".

如果我们使用'map()'并说routingEvent是NavigationEnd,不是更有效吗

这将会产生完全不同的效果.Filter方法的目的是从事件流中删除remove个事件.映射将保留所有内容,包括不是NavigationEnd事件的内容.

在Filter()中,我们说routingEvent是NavigationEnd.这会改变我们订阅时的输出吗?

是.我们正在识别NavigationEnd事件,然后返回True或False,这一事实将改变在运行时输出的内容.我们使用类型routingEvent is NavigationEnd而不是boolean这一事实将允许类型脚本在编译时反映该类型的缩小.

如果是这样的话,为什么我们不能直接返回True,因为我们只声明routingEvent是NavigationEnd?

这是法律代码,但它违背了目的,并会导致错误.Filter函数的目标是只允许NavigationEnd事件通过.如果只返回TRUE,则允许everything滑过筛选器.那么返回类型就是一个谎言.你告诉TypeScrip"我判断了这个,它是一个NavigationEnd."但你没有.TypeScrip在编译时会信任你,但在运行时你会得到错误.

Typescript相关问答推荐

处理API响应中的日期对象

在Angular中,如何在文件上传后清除文件上传文本框

在这种情况下,如何获得类型安全函数的返回值?

为什么typescript要把这个空合并转换成三元?

如何判断输入是否是TypeScript中的品牌类型?

如何正确地对类型脚本泛型进行限制

PrimeNG日历需要找到覆盖默认Enter键行为的方法

在包含泛型的类型脚本中引用递归类型A<;-&B

如何使用类型谓词将类型限制为不可赋值的类型?

有没有可能为这样的函数写一个类型?

使用动态输出类型和泛型可重用接口提取对象属性

如何从输入中删除值0

无法将从服务器接收的JSON对象转换为所需的类型,因此可以分析数据

从route.参数获取值.订阅提供";无法读取未定义";的属性

TS2739将接口类型变量赋值给具体变量

当传递带有或不带有参数的函数作为组件props 时,我应该如何指定类型?

如何静态键入返回数组1到n的函数

如何在Nextjs路由处理程序中指定响应正文的类型

为什么类型脚本使用接口来声明函数?他的目的是什么.

为什么 Typescript 无法正确推断数组元素的类型?