动态类型测试未按预期工作

2024-01-30

这是一个SSCCE http://sscce.org/.

我有一个地图容器类,其中内部Map是根据需要创建的set被调用的方法:

// @flow
'use strict';

class MapContainer {

    map: ?Map<any, any>;

    constructor() {
        this.map=null;
    }

    set(key: any, value: any): ?any {
        if (this.map===null) {
            this.map = new Map();
        }
        let prevValue: ?any;
        if (this.map!=null) { // first check
            prevValue = this.map.get(key);
        }
        if (this.map!=null) { // second check
            this.map.set(key, value);
        }
        return prevValue;
    }
}    
exports.MapContainer = MapContainer;

上面的代码通过了npm run flow没有任何警告。

但是如果我将两者合并if (this.map!=null)检查其中之一:

// @flow
'use strict';

class MapContainer {

    map: ?Map<any, any>;

    constructor() {
        this.map=null;
    }

    set(key: any, value: any): ?any {
        if (this.map===null) {
            this.map = new Map();
        }
        let prevValue: ?any;
        if (this.map!=null) { // merged check
            prevValue = this.map.get(key);
            this.map.set(key, value);
        }
        return prevValue;
    }
}    
exports.MapContainer = MapContainer;

…然后运行流程失败并显示以下消息:

es6/map-container.js:19
 19:                 this.map.set(key, value);
                 ^^^^^^^^^^^^^^^^^^^^^^^^ call of method `set`. Method cannot be called on possibly null value
 19:                 this.map.set(key, value);
                 ^^^^^^^^ null

es6/map-container.js:19
 19:                 this.map.set(key, value);
                 ^^^^^^^^^^^^^^^^^^^^^^^^ call of method `set`. Method cannot be called on possibly undefined value
 19:                 this.map.set(key, value);
                 ^^^^^^^^ undefined

…这对于第 19 行的访问来说完全没有意义:

this.map.set(key,value)

…仍然在支票范围内:

if (this.map!=null)

是什么赋予了?


问题是调用get方法可能会使细化无效。如果什么get sets this.map to null? Flow 无法知道,所以它假设最坏的情况。您可以执行以下操作:

class MapContainer {

    map: ?Map<any, any>;

    constructor() {
        this.map=null;
    }

    set(key: any, value: any): ?any {     
        if (!this.map) {
            this.map = new Map();
        }

        const map = this.map;

        let prevValue: ?any;
        if (this.map!=null) {
            prevValue = map.get(key);
            map.set(key, value);
        }
        return prevValue;
    }
}    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态类型测试未按预期工作 的相关文章

随机推荐

  • 哪里说 0x 前缀使文字成为十六进制基数?

    我知道我可以写0x1230FF在Python中 它将是一个值为1192191的字面int 但是我在官方文档或PEP中找不到任何指定这是允许的并且0x确实表示十六进制基数 我能找到的最接近的是PEP 3127 整数文字支持和语法 https
  • AS3 USB 游戏控制器支持

    如何让 USB 控制器控制我的 AS3 游戏 我现在正在使用键盘 我考虑过映射按键 但我必须为此使用一个插件 我只是希望用户能够购买一个不需要任何驱动程序下载 配置的 简单控制器 他们应该能够插入 USB 控制器并通过浏览器中的 Flash
  • Apple 推送通知身份验证密钥(沙盒和生产)

    我最近在为给定 iOS 客户端创建证书时注意到一个新选项 该选项的标题是 Apple 推送通知身份验证密钥 沙盒和生产 获取身份验证密钥以生成服务器端令牌 您可以使用 这些令牌作为您通知的证书的替代品 要求 一个身份验证密钥可以用于多个应用
  • 从 PowerShell 调用 CreateProcess

    我正在尝试打电话创建进程 http msdn microsoft com en us library windows desktop ms682425 28v vs 85 29 aspx来自 PowerShell API 调用表明它已成功
  • 如何将 TextView 值转换为 Integer

    美好的一天 编程勇士们 请帮我解决这个简单的问题 我是 Android 新手 如何将 TextView 值转换为 Integer 请看我附加的代码 谢谢 public class appleTrivia extends AppCompatA
  • Angular 9 - 伊斯坦布尔测试覆盖率报告生成为空

    我收到一份空报告 它列出了文件 但没有填充百分比 知道是什么原因造成的吗 错误信息 Handlebars 访问已被拒绝解析属性 语句 因为它不是其父级的 自己的属性 我的 package json 文件 dependencies angul
  • PL/SQL 存储过程输出游标到 VBA ADODB.RecordSet?

    在这篇文章的序言中 我想说我对 Excel 2007 vba 宏相当陌生 我正在尝试调用一个以游标作为输出参数的 Oracle PL SQL 存储过程 程序规范如下所示 PROCEDURE get product out cur data
  • 如何为 Azure Functions v3 配置 swagger ui 页面?

    我使用以下命令将 OpenApi 支持添加到 Azure 函数应用程序 v3 ConfigureOpenApi in Program Main 我对特定功能使用函数装饰 但如何控制 api swagger ui 上显示的通用 API 名称
  • httplib2 安装时权限被拒绝

    我正在尝试安装适用于 Python 的 httplib2 库 以便我可以使用它与 Twitter 进行交互 但当我尝试通过 python setup py install 进行安装时 我在控制台中收到以下错误 这是一个新的 MBA 我是唯一
  • 在 Node.Js Express 中,“res.render”是否结束 http 请求?

    因此 只有在确定一切都已完成时才执行 res render 对吗 因为它结束了请求并弹出了一个网页 如果您不提供回调res render view options fn 它会自动给出 200 HTTP Status 和 Content Ty
  • “快速路径”无竞争同步是什么意思?

    来自性能和可扩展性的章节JCIP书籍 http jcip net s3 website us east 1 amazonaws com 同步机制针对无竞争的情况进行了优化 case 易失性始终是无争议的 在撰写本文时 快速路径 无竞争同步范
  • 撤消 git 过滤分支

    我不小心使用 git filter branch 从我的存储库中删除了一个文件 git filter branch f index filter git rm cached ignore unmatch images thumb a JPG
  • 在编译时生成唯一的数字

    我想为标题中的每个类生成唯一的数字 在我的例子中为素数 但我们可以说这应该只是连续的数字 即 1 2 3 4 等 当然我可以对这些进行硬编码 struct A enum ID 1 struct B enum ID 2 struct C en
  • 使用 React Navigation,如何强制抽屉导航器弹出到堆栈顶部?

    我正在使用 React Navigation 并有一个抽屉式导航器 其中包含多个 Stack Navigator 作为其项目 当我打开抽屉导航器并单击某个项目时 它会显示我单击的堆栈中的第一个屏幕 当我转到堆栈中的第二个屏幕 然后打开抽屉并
  • JS:查找对象数组中的最大数字

    找到对象数组中最大数字并返回该对象的最简单方法是什么 var arr num 0 5 num 1 num 0 35 尝试使用 forEach 但除了存储每个数字并比较它们之外无法找到一种方法来做到这一点 任何帮助表示赞赏 提前致谢 redu
  • 尝试了解 Latex、Sweave 和 R 之间的工作流程

    假设我编写了以下小 Rnw 文件 documentclass article usepackage utf8 inputenc usepackage Sweave usepackage tikz usepackage pgf begin d
  • SVG 过滤器无法正常工作直线[重复]

    这个问题在这里已经有答案了
  • Visual Studio 不显示打字稿错误

    我遇到了奇怪的问题 我已经安装了 VS2013 和 typescript 当我点击保存按钮时 ts文件 调用 ts 编译器 但 VS 没有显示任何 ts 错误 如果编译器失败我只会收到一条消息 Input file contained se
  • IronRouter 上的上一页位置

    在 IronRouter 中 有没有办法在转到下一页之前获取上一页位置 我可以使用一个事件来获取此信息吗 提前致谢 由于 Iron Router 使用常用的 History API 因此您可以使用普通的 JS 方法 history go 1
  • 动态类型测试未按预期工作

    这是一个SSCCE http sscce org 我有一个地图容器类 其中内部Map是根据需要创建的set被调用的方法 flow use strict class MapContainer map Map