为什么在分配给变量(别名条件)时,类属性的类型缩小检查不起作用?

2023-11-26

如何缩小别名条件表达式中类的属性类型?

Short:在类方法中,我想进行类型缩小检查,例如this._end === null && this._head === null,但我想首先将此检查的结果分配给一个变量,然后再在类型缩小中使用它if条款。它没有按预期工作。

不短: 假设我们有一个Queue class:

class Queue {
  private _length: number = 0;
  private _head: Node | null = null;
  private _end: Node | null = null;

  public enqueue(node: Node): boolean {
    this._length += 1;

    const isQueueEmpty = this._end === null;
    if (isQueueEmpty) {
      this._head = node;
      this._end = node;
      return true;
    }

    this._end.setLink(node); // TypeScript doesn't understand that this._end passed the null check 
                             // in the if statement and writes that this._end can be null. 
    this._end = node;
    return true;
  }
}

如果您在以下地方写了一张支票enqueue直接在函数中if条件,那么 TypeScript 就会明白这._结束 is not null:

public enqueue(node: Node): boolean {
  this._length += 1;

  if (this._end === null) {
    this._head = node;
    this._end = node;
    return true;
  }

  this._end.setLink(node); // Now TypeScript understand that this._end passed the null check
  this._end = node;
  return true;
}

但事实证明代码的描述性较差。

而且,总的来说,我需要说的是,该类的两个属性都通过了null查看。具体来说:这个._head and 这._结束.

我写了以下方法:

type QueuePointerKeys = '_head' | '_end';

private _isQueueEmpty(): this is this & { [K in QueuePointerKeys]: null } {
  return this._end === null;
}

但这不起作用。如果你把它放在enqueue方法,那么:

public enqueue(node: Node): boolean {
  this._length += 1;

  if (this._isQueueEmpty()) {
    this._head = node;     // TypeScript writes that a variable of type null cannot be assigned the type Node
    this._end = node;      // TypeScript writes that a variable of type null cannot be assigned the type Node
    return true;
  }

  this._end.setLink(node); // TypeScript doesn't understand that this._end passed the null check
                           // in the if statement and writes that this._end can be null.
  this._end = node;
  return true;
}

如何使用类方法,例如_isQueueEmpty用于缩小类型?其工作原理类似于this._end === null && this._head === null直接用作条件if陈述?


别名条件和判别式的控制流分析最近才添加,它有局限性,包括:

仅当条件表达式或判别式属性访问在没有类型注释的 const 变量声明中声明,并且被缩小的引用是 const 变量、只读属性或未对其进行赋值的参数时,才会发生通过间接引用进行缩小的情况函数体。

Since this._end不是只读属性,它不会为您工作。我通过分配确认这是你的问题this._end到局部 const 变量,然后将其用于条件以及setLink call:

interface Node {
  setLink(node: Node): void
}

class Queue {
  private _length: number = 0;
  private _head: Node | null = null;
  private _end: Node | null = null;

  public enqueue(node: Node): boolean {
    this._length += 1;

    const end = this._end
    const isQueueEmpty = end === null;

    if (isQueueEmpty) {
      this._head = node;
      this._end = node;
      return true;
    }

    end.setLink(node);
    this._end = node;
    return true;
  }

}

事实上,有一个针对您的具体案例的悬而未决的问题:别名条件的控制流分析无法缩小对象属性 #46412, 也允许在别名条件表达式中使用非只读属性 #44972.

希望他们能尽快找到解决方案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在分配给变量(别名条件)时,类属性的类型缩小检查不起作用? 的相关文章

  • 从 JavaScript 中 Firebase 数据库的查询结果中获取特定子项的值

    我在 Firebase 上有这个示例数据库 样本数据库 我有一个index html 其中有这两个输入文本 div class login form h2 Login Form h2 div
  • 从字符串中删除货币符号并使用 Javascript 中的单行转换为数字

    我下面有一个字符串 它是以英镑为单位的价格 我想删除货币符号 然后将其转换为我可以用来与另一个值进行比较的数字 价格 例如 X gt Y 14 50 我之前已将字符串转换为用于货币的数字 var priceNum parseFloat pr
  • 这个特定的 ReactJs 代码是如何执行的初学者问题?

    我是初学者 正在阅读大量代码 现在我想知道下面的代码我明白这段代码在做什么 我需要澄清的是代码流程 当我运行它时 我看到图像正在加载 React 是从上到下执行代码吗 占位符图像异步获得正确的图像 但会App如果需要时间 组件会开始渲染但没
  • Atom“自动完成”不起作用

    因此 当您安装 Atom 时 autocomplete 会随其一起提供 并且默认情况下处于启用状态 当我编写代码时 什么也没有显示 为什么 是否需要配置任何文件才能正常工作 In autocomplete plus settings pag
  • IE 9 的子元素不透明,我无法使用 captify 阻止它

    好的 我正在使用一段名为 Captify 的 javascript 它为您的图像添加了一个带有文本的小弹出窗口 适用于所有接受 IE9 的浏览器 IE9 会淡化弹出 div 中的所有内容 我已阅读其子元素问题 但无法修复它 由于在网上任何地
  • 在 AngularJS 中覆盖运行时的依赖关系

    我有一个服务叫 doggedHttp 它公开了与 http 现在我想创建一个 doggedResource服务是有角度的 resource服务之上 doggedHttp代替 http 换句话说我想注入 doggedHttp as the h
  • GeoJSON 要素坐标未显示在 OpenLayers 地图上

    我正在尝试显示一个GeoJSON地图上的多边形 我使用了 OpenLayers 提供的示例以及以下数据 但仅显示第二个多边形 var geojsonObject type FeatureCollection crs type name fe
  • 在 NPM 上捆绑并发布客户端 Web 代码

    我制作了一个 JavaScript 文件 假设它的内容是这样的 let myCoolAlert str gt alert str in a different js file SO doesn t allow you to cross fi
  • RxJS - 从可观察对象中获取最后 n 个元素

    我想从可观察对象中获取最后 3 个元素 假设我的时间线是这样的 a b c d e f g h i j gt where a b c d e f g h i j are emitted values 每当发出新值时 我想立即获取它 因此它可
  • Firefox OS 后台服务

    我想构建一个应用程序 用户可以通过它输入一些设置 并且应用程序将启动后台服务来根据这些设置执行一些任务 我只想在模拟器中运行应用程序和后台服务 我知道它需要 认证 模式才能运行后台服务 但我现在不考虑在 Firefox Marketplac
  • Typeahead.js 干扰 Bootstrap 输入组

    如何防止 Typeahead js 拆分我的 Twitter Bootstrap 3 输入组 每当我将 Typeahead javascript 指向属于输入组一部分的文本区域时 连接的文本区域和提交按钮就会停止连接 这只是 Typeahe
  • 如何在变量名中使用变量

    所以我正在使用这样的 json 变量 opponentInvData item1 它包含项目 1 到 6 我需要动态访问不同的项目并将它们设置为空 itemNum 是我需要访问的特定项目 我正在尝试使用 eval 函数 var itemNu
  • 可选链接在 create-react-app 中不起作用

    In a create react app项目 我正在使用 babel plugin proposal optional chaining在我的 babelrc中 但是 我有这个错误 Module parse failed Unexpect
  • JavaScript 数组中的负索引是否会影响数组长度?

    在javascript中我定义了一个像这样的数组 var arr 1 2 3 我也可以做 arr 1 4 现在如果我这样做 arr undefined 我也失去了对值的引用arr 1 所以对我来说 从逻辑上来说 arr 1 也是arr 但是
  • JS中如何过滤多个字符串? [复制]

    这个问题在这里已经有答案了 我希望能够过滤数组中的多个字符串 类型 例如我想过滤类型meat并输入fruit在下面的数据结构中 我想要实现的是过滤数据对象 const data type meat food hamburger type f
  • 禁用 Materialise Carousel 上的触摸

    看起来以前没有人问过这个问题 因为我几乎在互联网上寻找一个非常简单的答案 如何禁用在物化轮播上向左 向右滑动的功能 在 Materialize js 添加 编辑 var allowCarouselDrag true value functi
  • addEventListener keydown 不起作用

    我在互联网上找到了一些基本的 Pong 代码 并尝试添加按键 代码在这里 http cssdeck com labs ping pong game tutorial with html5 canvas and sounds http css
  • 将元素添加到 D3 圆包节点

    我正在尝试制作一个可缩放的圆形包装图 我希望每个子圆圈包含一个较小的图表 该图表始终具有相同的结构 即 4 列 只有条形的高度会改变 我尝试添加一个简单的rect到目前为止我的图表 但矩形没有添加到圆圈中并且是静态的 JS var marg
  • Javascript:修改原型不会影响现有实例[重复]

    这个问题在这里已经有答案了 我创建了原型的 2 个实例 更改了原型中的函数 更改反映在两个实例中 很棒 但是 当我通过删除该函数来修改原型时 该函数对于现有实例仍然存在 function A this name cool A prototy
  • 截断段落前 100 个字符并隐藏段落的其余内容,以通过更多/更少链接显示/隐藏其余内容

    我有一个超过 500 个字符的段落 我只想获取最初的 100 个字符并隐藏其余部分 我还想在 100 个字符旁边插入 更多 链接 单击更多链接时 整个段落应显示并编辑文本 更多 到 更少 单击 更少 时 它应切换行为 段落是动态生成的 我无

随机推荐

  • 课程末尾的美元符号在 Eclipse MAT 中意味着什么?

    我正在使用 Eclipse MAT 尝试追踪 Android 中的资源泄漏 如果您经常更改屏幕方向 当我转到直方图视图时 我看到我的活动与一次又一次列出的相同活动一起列出 并带有 在它之后 So like com test TestActi
  • 将“rlang”准引用与“dplyr::_join”函数一起使用

    我正在尝试编写一个我使用的自定义函数rlang的准引用 该函数内部也使用dplyr s join功能 我在下面提供了一个最小的工作示例来说明我的问题 needed libraries library tidyverse function d
  • 打印 html 文档时所有页面中的 HTML 页眉和页脚

    我创建了一个带有页眉 一些内容和页脚的 html 页面 我尝试打印 HTML 页面 结果有 2 页 我在第一页得到了页眉 在最后一页得到了页脚 我真正需要的是在所有页面中显示页眉和页脚 就像在 Word 文档中一样 我查了一下 发现使用th
  • 如何使用 Android 数据绑定动态更改视图可见性

    我正在尝试使用数据绑定实现一种简单的视图隐藏 显示 我有一个 api 调用 并且在 api 调用正在进行时我必须显示一个进度条 一旦我收到响应 就必须忽略此进度并显示数据 我尝试使用数据绑定动态更改进度条的可见性 但什么也没发生 仅在第一次
  • Python - 使用 pytest 跳过测试,除非指定

    背景 我正在使用 pytest 来测试将数据推送到数据库的网络抓取工具 该类仅拉取 html 并将 html 推送到数据库以供稍后解析 我的大多数测试都使用虚拟数据来表示 html Question 我想做一个测试 从网站上抓取网页 但我希
  • Jaxb 生成的 xml - 根元素前缀问题

    我正在尝试使用 jaxb 生成 xml 我创建了 xsd 并生成了 java 类 但是当我生成 xml 时 我在根标记中添加前缀 ns2 这是我不想要的 例如 我希望根标签是
  • 如何使SurfaceView具有透明背景?

    我有简单的布局
  • SQLAlchemy 不会更新我的数据库

    我正在使用 SQLAlchemy 0 7 8 制作金字塔应用程序 我使用的是64位Python3 2 问题是 为什么以下函数不向数据库提交任何内容 def create card sText sCard create a wildcard
  • Objectify 和 TimerTask:没有为此线程注册 API 环境

    我想得到一个TimerTask设置为定期从 Google App Engine 数据存储中删除条目 我是否设置了一个ServletContextListener with a Timer 在 的里面contextInitialized 我已
  • 涉及 Enum 的多重继承元类冲突

    我需要一个枚举类的双重继承 但也支持我自己的方法 这是上下文 import abc from enum import Enum class MyFirstClass abc ABC abc abstractmethod def func s
  • 如何在 DENO 中使用 npm 模块?

    德诺超级酷 我早上看到了 现在想迁移到 deno 我试图将现有的 Nodejs 脚本移至 deno 任何人都可以帮助我如何在 deno 中使用 npm 模块 我需要 esprima 模块 这个有包https github com denol
  • 通过 jquery.couch.js 或其他方式在 Couchapp/CouchDB 中进行用户注册

    背景 现在 我正在尝试使用 couchDB couchapp 构建一个应用程序 该应用程序将存储来自用户的持久且重要的信息 并且停留在用户使用 couchapp 注册所需的步骤上 本质上 我想做的是有一个简单的注册表单 用户可以使用它来注册
  • 如何与 PHP 设置 WebSocket 安全连接?

    我找不到任何有关在 PHP 中设置 wss 连接的信息 我连接抛出ws没有问题 顺便说一句 我正在使用这个非常棒的库来做到这一点 https github com albeva php websocket 但我的网站使用 https 我需要
  • 设置RadioButton的value属性

    我需要根据从数据库返回的数据构建一个单选按钮列表 每个按钮都需要有一个与之关联的值 我可以根据所选按钮获取该值 理想情况下我只会使用RadioButtonList控件 但是 我需要一个非常自定义的布局RadioButtonList似乎无法处
  • 使用 Avaudioengine iOS 的低通滤波器 + 采样率转换

    我们正在开发一个项目 该项目允许我们使用一些低通滤波器和高通滤波器以 5k Hz 采样率从麦克风录制一些声音 我们正在使用什么 我们正在使用音频引擎以此目的 我们正在使用AVA音频转换器用于降低采样率 我们正在使用AVAudioUnitEQ
  • JavaScript 对象的动态深度选择

    对于单个属性 这相当简单 var jsonobj test ok var propname test Will alert ok alert jsonobj propname 但我想做的是使用嵌套属性 var jsonobj test te
  • sqlite3-ruby 无法在 rvm 1.8.7 上运行

    从 RVM 1 8 7 开始升级到 Rails 3 操作系统 10 5 8 Output josh crewss macbook joshcrews gem install sqlite3 rubyBuilding native exten
  • scrapy 蜘蛛中的多重继承

    是否可以创建一个继承两个基本蜘蛛 即 SitemapSpider 和 CrawlSpider 功能的蜘蛛 我一直在尝试从各个网站抓取数据 并意识到并非所有网站都列出了网站上的每个页面 因此需要使用 CrawlSpider 但 CrawlSp
  • 为什么浏览器不支持gRPC?

    gRPC 基于 HTTP 2 假设 得到浏览器的广泛支持 因此 我觉得从浏览器使用gRPC应该没有问题 然而 很明显有一个问题 协议 grpc web 是不同的 因为 由于浏览器限制 而存在 还有大量博客文章描述了为让 gRPC 在浏览器中
  • 为什么在分配给变量(别名条件)时,类属性的类型缩小检查不起作用?

    如何缩小别名条件表达式中类的属性类型 Short 在类方法中 我想进行类型缩小检查 例如this end null this head null 但我想首先将此检查的结果分配给一个变量 然后再在类型缩小中使用它if条款 它没有按预期工作 不
Powered by Hwhale