函数如何检查打字稿中的 null ?

2024-01-08

在 typescript 2.6 中,我想编写一个执行空检查的函数。当我启用严格的空检查时,typescript 2.6 会抱怨以下代码。 (注意,使用空检查时直接起作用)

编辑:已更正notNullOrUndefined因为它没有检查 foo

interface A {
  foo: string | undefined;
}
const notNullOrUndefined = (a: A): boolean => {
  return a.foo != null;
}
const len = (a: A): number => {
  //if (a.foo != null) {
  if (notNullOrUndefined(a)){
    return a.foo.length;
  }
  return 0;
} 

这是一个可以玩的例子:example https://www.typescriptlang.org/play/#src=interface%20A%20%7B%0D%0A%20%20foo%3A%20string%20%7C%20undefined%3B%0D%0A%7D%0D%0Aconst%20notNullOrUndefined%20%3D%20(a%3A%20A)%3A%20boolean%20%3D%3E%20%7B%0D%0A%20%20return%20a.foo%20!%3D%20null%3B%0D%0A%7D%0D%0Aconst%20len%20%3D%20(a%3A%20A)%3A%20number%20%3D%3E%20%7B%0D%0A%20%20%2F%2Fif%20(a.foo%20!%3D%20null)%20%7B%0D%0A%20%20if%20(notNullOrUndefined(a))%7B%0D%0A%20%20%20%20return%20a.foo.length%3B%0D%0A%20%20%7D%0D%0A%20%20return%200%3B%0D%0A%7D%20

解决这个问题的打字稿方法是什么?


EDIT: updated to reflect fixing a typo in question: The question is a little confusing, since your notNullOrUndefined() doesn't check a.foo at all, so it's not surprising that those would be different.

请注意,与--strictNullChecks上,你已经定义了len()所以这样a参数是一个A,因此cannot为空或未定义。所以你不必检查a本身在里面len()功能实现;相反,您需要确保您传递给的任何内容len()是一个有效的A. So notNullOrUndefined()是一个坏名字,因为你正在检查foo参数的值,而不是参数本身。请随意将其更改为类似的内容fooPropertyIsNotNull();我暂时离开它。

这里的主要问题是 TypeScript 认识到if (a.foo != null) { ... } is a 类型保护 https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-type-assertions,并缩小a.foo to string在 - 的里面{ ... }条款。但类型保护不会传播 https://github.com/Microsoft/TypeScript/issues/14891自动退出函数,因此 TypeScript 无法理解这一点notNullOrUndefined()其本身充当类型保护。

幸运的是,这个问题很常见,TypeScript 提供了用户定义的类型保护 https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards:如果你有一个返回a的函数boolean这缩小了其参数之一的类型,您可以更改boolean返回类型为a类型谓词, 使用x is T句法。这是为了notNullOrUndefined():

const notNullOrUndefined = (a: A): a is { foo: string } => {
  return a.foo != null;
}

所以函数签名说:如果你传入一个A,它将返回一个布尔值。如果返回的话true,那么传入的参数就缩小为{ foo: string }。现在您将不会收到任何错误,如您所愿:

interface A {
  foo: string | undefined;
}
const notNullOrUndefined = (a: A): a is { foo: string } => {
  return a.foo != null; // checking a.foo
}
const len = (a: A): number => {
  if (notNullOrUndefined(a)){
    return a.foo.length; // okay
  }
  return 0;
} 

希望有帮助,祝你好运!

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

函数如何检查打字稿中的 null ? 的相关文章

  • 是否可以使用 TypeScript 对 jQuery.fn.extend 进行建模

    我的猜测是 答案是 否 但我想检查一下是否有我错过的东西 jQuery 有一个fn extend 方法 http api jquery com jQuery fn extend 它允许您使用额外的方法来扩充 jQuery 对象 以下是 AP
  • 与拉斐尔的路径位置

    我如何使用 raphael js 更改路径位置 很奇怪的是 明显的方法不起作用 var p paper path some path string p attr fill red p attr x 200 y 100 not working
  • 是否有正确的方法将自定义 Javascript 添加到 ASP.NET MVC 5 页面?

    目前 我已将 jQuery 源文件添加到 ASP NET 项目的 Scripts 文件夹中 在 Layout cshtml 页面中 我包含了 Scripts jquery 2 1 1 min js 现在 我可以在我制作的每个页面上包含 jQ
  • 动画和过渡的组合无法正常工作

    我一直在尝试添加一些基本的 CSS3 动画 目标是在按钮的单击事件上切换类 并根据添加的类对 div 进行动画处理 该代码对于 Firefox 中切换的第一次迭代完美运行 但对于 Chrome 等其他浏览器以及 Firefox 中的下一次迭
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • Mapbox 打字稿

    通过关注这个项目 我成功地让 Leaflet 与 Angular 2 和 Webpack 一起工作 Angular 2 传单启动器 https github com haoliangyu angular2 leaflet starter 我
  • 帮助在 UIWebView 中使用 Javascript 代码

    我想在 webView 中运行以下代码 以便内容可编辑 javascript document body contentEditable true document designMode on void 0 到目前为止 我已经尝试过这个 v
  • 移动设备上的剩余悬停效果

    我一整天都在努力做这个JSFiddle http jsfiddle net gsamaras q2w4jjyt 4 也适用于手机 但我所有的尝试都没有效果 在桌面上 当用户将鼠标悬停在箭头上时 它会变成红色 在移动设备上 当用户触摸 为了单
  • JavaScript 语法是什么:{Ci, CC}? [复制]

    这个问题在这里已经有答案了 我正在做一些 FF 附加开发 我看到这样的语法 var Cc Ci require chrome 只是好奇这个语法是什么 以及它是否对 FF 开发或其他东西有特殊意义 这称为解构赋值 它的一个特点是JavaScr
  • 对 UPDATE 行的 POST 请求

    我是 javascript 的新手 所以我正在寻找一些帮助来创建一种拖放地理编码标记的方法 以允许交互式更改地址 我相信通过更新 LOCATION 列行可以实现这一点 第一步是 发送 POST 请求 对吧 好吧 所以我想问是否有人可以给我看
  • Opera Mobile 9.7 Beta 设置焦点 [重复]

    这个问题在这里已经有答案了 我们使用手持式扫描仪将物品移入和移出库存 扫描仪运行一个 ASP 页 该页提交表单以移动项目 我们最近购买了一台运行 Windows Mobile 6 1 的新扫描仪 很快就意识到 Mobile IE 完全没用
  • 禁用 HTML 验证。如何为全局每个表单设置“novalidate”?

    我想知道是否可以做一些事情来禁用应用程序中每个表单的 HTML 验证 有什么办法可以做到这一点或者我应该添加novalidate每个表单标签的属性 看来唯一的方法是添加novalidate使用 JavaScript jQuery 为每个表单
  • TypeScript如何在每个文件中声明全局变量?

    我喜欢定义一个全局可用的助手 global p console log bind console 所以我可以使用p some message 代替console log some message 但 TypeScript 抱怨说p未定义 有
  • 将 ngModel 绑定到自定义指令

    所以我已经在这个问题上工作了一个星期了 但我似乎无法理解整个指令的事情 我读了很多帖子 揭秘指令 http www toptal com angular js angular js demystifying directives 指令 ht
  • 如何用 GreaseMonkey 替换 onclick 事件?

    该网站有一个图片库 每次我单击缩略图时 它都会在新选项卡中打开 URL 不是因为我将 Firefox 设置为在新选项卡中打开链接 我只想在同一窗口中打开 URL 缩略图的示例如下 span class thumb a href post i
  • 谷歌地图的灰度

    有没有什么方法可以在不丢失任何其他功能的情况下以灰度显示 Google 地图 通过 Javascript API 嵌入 是的 他们在 api V3 中引入了StyledMaps http code google com apis maps
  • 使用 Javascript 从 HTML 表格输入单元格获取值

    我使用 Javascript 动态创建了一个 HTML 表 其中第一列由文本字段组成 第二列由输入字段组成 第三列由文本字段组成 效果很好 nrOfRows document getElementById myId value get nr
  • 如何比较 JavaScript 表格中的单元格并测试是否相等? indexOf 是如何工作的?

    我在 HTML 代码中创建了一个表格 它有 9 列和 13 行 它被 JavaScript 循环完全填满 该循环用几个数组中的人名填充它 但是 我想添加一个验证步骤 确保一行中没有两个单元格具有相同的值 并且每个单元格的值不会在其正下方的单
  • iOS 上 Safari 中的 shift 键

    有没有办法在javascript中判断手机键盘上是否按下了shift键 并将其与大写锁定 按两次shift键 区分开来 一些事实 首先 让我们看一下有关 iOS 键盘的一些事实 我假设您已经知道了 当您进入键盘模式时 shift键始终处于激
  • 使用 ASP.Net 和 Ajax 的登录页面

    我正在尝试使用 html ajax 和 ASP NET 制作登录页面 数据确实传递给 ajax 函数 但是当我调试 asp 页面时 用户名和密码以 NULL 发送 该代码应该获取用户名和密码 然后返回用户 ID html页面 div Use

随机推荐

  • 如何使用 Fakes Framework shims 模拟/隔离 VS 2012 中的内部类?

    所以 问题是我的程序集中有一堆内部类 由我想要测试的类使用 由于访问器已从 VS2012 中删除 我可以使用 InternalsVisibleTo 这非常有效 除了当我尝试 shimify 我的内部类时 它们对 Fakes 框架不可见 我还
  • 如何使用 CSS 调整图像大小以适合其容器

    我想制作具有恒定宽度和高度的 div 其中包含尺寸未知的子图像 像这样的东西 我最接近的是max height inherit max width inherit但它改变了纵横比 parent border 1px solid width
  • 数据封装...?

    谁能向我解释一下 Objective C 中的数据封装是什么 有人告诉我这是 Objective C 的一个重要概念 但我不明白为什么 向我解释一下 就像我 5 岁一样 然后又好像我 25 岁一样 谢谢你的时间 丹尼尔 From http
  • 将日期格式代码转换为日期

    用户应该以以下格式输入日期 m d Y 我需要做的是将日期转换为 11 11 2013 这是今天的日期 我没有太多处理日期的工作 有没有某种方法可以开箱即用地进行这种转换 我查看了 DateTime 选项 但找不到我需要的内容 Edit 从
  • 这个错误是由于编译器对 RefCell 的特殊了解造成的吗?

    fn works lt a gt foo Option lt a mut String gt s a mut String fn error lt a gt foo RefCell
  • 如何正确使用 nextjs 中间件功能和 getServerSideProps 功能?

    我正在尝试使用 nextjs 中间件功能 这里我创建中间件文件并添加此代码 import type NextRequest from next server import NextResponse from next server expo
  • Indy 在每个 72 个字符处添加 = 并使用多部分表单数据发布

    通过 Delphi XE 和 Indy 我得到了一些提交到 Web 表单的代码 idhttp TidHttp create postData TIdMultiPartFormDataStream Create try postData Ad
  • 点击 UIAlertController 外部时如何关闭 UIAlertController?

    如何解雇UIAlertController当点击外部时UIAlertController 我可以添加一个UIAlertAction风格的UIAlertActionStyleCancel驳回UIAlertController 但我想添加当用户
  • .net 中的 IE 插件开发

    我如何在 net 中为 ie 开发插件 我基本上希望开发一个像 IE7Pro 这样的内联拼写检查插件 看一下这个 开发 IE 插件 http www enhanceie com ie dev asp
  • 使 flex item 为其文本的宽度

    我想要一个有两列的布局 其中左列是某种侧边栏 现在我想在侧边栏中使用一些不应换行的文本 当我这样做时 它会导致某种溢出 然后使用overflow hidden隐藏了文本的很大一部分 如何修改左列以使用展开文本的宽度和右列以使用剩余空间而不丢
  • 构建 docker-compose 映像时无法连接到 MySQL

    我有 docker compose 的配置 在构建数据库步骤中 django 管理抛出错误 django db utils OperationalError 2002 无法连接到 127 0 0 1 115 上的MySQL服务器 我认为 码
  • numpy 将分类字符串数组转换为整数数组

    我正在尝试将分类变量的字符串数组转换为分类变量的整数数组 Ex import numpy as np a np array a b c a b c print a dtype gt gt gt S1 b np unique a print
  • Angular HTML5 URL - 服务器配置

    我读过 AngularJS 使用 hashbang URL 作为默认值 但这不是一个优势 因此应该使用 HTML5 URL 为了在客户端配置此行为 必须完成以下操作 locationProvider html5Mode true 在服务器端
  • INSTALL_NON_MARKET_APPS 替代方案?

    我需要检查 安装来自未知来源的应用程序 选项是否启用或禁用 然而 INSTALL NON MARKET APPS在 API 17 中已弃用 是否有新的替代方法来检查这一点 这是旧的检查方法 boolean canInstallFromOth
  • Matplotlib 中极坐标图的插值差异

    我正在尝试在极坐标图上生成等值线图 并在 matlab 中编写一些快速脚本以获得一些结果 出于好奇 我也想使用 matplotlib 在 python 中尝试同样的事情 但不知何故 我看到相同输入数据的不同组等高线图 我试图弄清楚发生了什么
  • 如何仅聚合混合数据类型数据框中的数字列

    我有一个混合的pd DataFrame import pandas as pd import numpy as np df pd DataFrame A 1 B pd Timestamp 20130102 C pd Timestamp 20
  • 搜索/迭代 boost::spirit::qi::symbols

    如果我有一个符号表 struct MySymbols symbols
  • OCaml构造函数解包

    是否可以通过将数据绑定到单个值而不是元组来解包类型 type foo Foo of int string type foo Foo of int string Foo 3 bar Foo 3 bar Error The constructo
  • 如何为 geopandas 图制作表格图例

    我正在使用 geopandas 绘制分区统计图 并且需要绘制自定义的表格图例 这个问题 https stackoverflow com questions 44567107 how to make tabular legend using
  • 函数如何检查打字稿中的 null ?

    在 typescript 2 6 中 我想编写一个执行空检查的函数 当我启用严格的空检查时 typescript 2 6 会抱怨以下代码 注意 使用空检查时直接起作用 编辑 已更正notNullOrUndefined因为它没有检查 foo