在 TypeScript 的类方法中使用类型谓词

2023-12-25

我有一个这样定义的类

class Foo {
   value: string | null;
   constructor(){
      this.value = null;
   }
   private ensureValueExists():this.value is string{ //type predicate is not legal
      this.value = "bar";
      return true;
   }
   doStuffWithValue(){
      this.ensureValueExists();
      return 5 + this.value;  //ERROR, this.value can be null
   }
} 

我希望 EnsureValueExists 方法能够告诉编译器 this.value 确实是一个字符串并且可以安全使用。 是否有特殊的语法可以使用,或者目前对于方法来说 TS 无法实现?


您可以使用断言方法 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#assertion-functions这缩小了this。文档中对此的支持并不是特别明确,尽管commit https://github.com/microsoft/TypeScript/pull/32695/commits/0599f848575dcfbda5730c446003f4e59411446d有关联微软/TypeScript#32695 https://github.com/microsoft/TypeScript/pull/32695,实现断言函数的 PR,证明了这是可能的。

所以在你的情况下它看起来像:

  private ensureValueExists(): asserts this is { value: string } {
    this.value = "bar";
  }

(请注意,您不能在断言函数/方法中返回任何内容),然后执行以下操作:

  doStuffWithValue() {
    this.ensureValueExists();
    return 5 + this.value;  // okay
  }
}

肯定有caveats https://github.com/microsoft/TypeScript/issues/34596#issuecomment-544208587与断言函数和方法相关联,但由于您只在this,你不会在这里遇到他们。

Playground 代码链接 https://www.typescriptlang.org/play?ts=4.3.5#code/MYGwhgzhAEBiD29oG8BQ1oDcwgK4FMAuaCAFwCcBLAOwHNoAfaa3EEAbnWmHmrPNzBS8cgAoAlCi4ZSAC0oQAdNjz5oAXmasOXAL5cADlWyk1+PrnL4AajgIBRAB4LSECcUgR85V9DkLoAOQsOyISChp6XSkMGXklFQINaAAiACMwchTODH0MABN4AGVSXAAzMoB1SjlbVQkY2P8lcwhLG1CnFzdxHNirUvJqaABWaABqP3jlUPYMAHp56HgAazAATz1UfVQgA

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

在 TypeScript 的类方法中使用类型谓词 的相关文章

随机推荐

  • 带下拉菜单的角度过滤

    我有以下代码 HTML
  • Python SVG 转换器创建空文件

    我下面有一些代码应该将 SVG 图像转换为 PNG 它运行没有错误 但创建了一个空白的 PNG 文件而不是与原始 SVG 具有相同图像的图像 我确实发现这不是 cairo 的错误 而是与 rsvg 有关的更多错误 我得到了here http
  • 调试 BigQuery 存储过程

    有什么方法可以在 BigQuery 存储过程中使用 print 语句吗 我有一个如下所示的存储过程 我喜欢查看如何生成 SQL 语句来调试问题或任何其他更好的方法来调试存储过程正在生成的内容等 CREATE OR REPLACE PROCE
  • 我的 google 地图 api 脚本出了问题

    在 完成 网络部分之后 我一直在做项目的移动部分 我正在使用谷歌地图API 我编写了以下代码 function codeAddress var image images tickmark1 png var address document
  • 内部 cmd.exe 命令设置的 ERRORLEVEL 值是多少?

    ERRORLEVEL 是大多数 cmd exe 命令结束时返回的值 该值根据一系列条件而变化 因此了解命令返回的值是有价值的信息 可能有助于编写更好的批处理文件 所有外部 exe 程序在结束时都会更改 ERRORLEVEL 这是两者的固有机
  • NSURLSession/NSURLConnection HTTP 加载在 iOS 9 上失败

    尝试在 iOS9 上运行我现有的应用程序 但在使用时失败AFURLSessionManager block NSURLSessionDataTask task self sessionManager dataTaskWithRequest
  • 表示 SQL 数据库中的列表

    我正在用 C 编写一个带有 SQL 数据库的应用程序 我有一个模型 Person string id unike key string name List
  • 如何打印Python列表中包含的字典的键和值

    lloyd name Lloyd homework 90 0 97 0 75 0 92 0 quizzes 88 0 40 0 94 0 tests 75 0 90 0 alice name Alice homework 100 0 92
  • 使用 REST 删除多条记录

    删除多个项目的 REST 方式是什么 我的用例是我有一个 Backbone Collection 其中我需要能够一次删除多个项目 选项似乎是 为每条记录发送一个 DELETE 请求 如果可能有几十个项目 这似乎是一个坏主意 发送 DELET
  • iPhone 可以支持的最大纹理尺寸是多少?

    1024 1024 或者 iPhone3gs 及以上版本只有 2048 2048 正如 iPhone 3GS 一样PowerVR SGX535 http en wikipedia org wiki IPhone ModelsGPU 最大纹理
  • 为什么在 javascript 中添加 2 + 4 时得到 24

    我正在尝试这个 function add things var first 2 var second 4 alert first second 但它给了我 24 而不是 6 我做错了什么 您正在使用 运算符连接两个字符串 尝试以下任一方法
  • JQuery 函数只能在函数内工作

    我有一个带有下拉列表的页面和 添加新 中的选项之一 为它创建的函数效果很好 town id on change function if this val ADD NEW console log Add New town id val tow
  • self 未在离子角度服务器端渲染中定义

    我正在关注https ionicframework com blog ssr with angular universal and ionic https ionicframework com blog ssr with angular u
  • 如何在控制器中使用过滤器?

    我编写了一个过滤函数 它将根据您传递的参数返回数据 我希望我的控制器具有相同的功能 是否可以在控制器中重用过滤器功能 这是我到目前为止所尝试过的 function myCtrl scope filter1 i simply used the
  • 如何使用 Maven 配置文件?

    我是 Maven 新手 在这个资源和其他资源中阅读了一些有关配置文件的信息 据我了解 如果我们想要覆盖一些默认值或做一些特定的事情 我们就使用配置文件 在我的遗留项目中 我可以看到下面的配置文件 我只看到覆盖 app mode 属性 但我没
  • 为什么我的 64 位服务以 32 位运行?

    我的 Windows 服务遇到了这个问题 在 Visual Studio 中 我已将其平台目标设置为 64 位 我已经运行 CorFlags 来验证它是否设置正确 我得到以下信息 Version v4 0 30319 CLR Header
  • ngrx EffectsModule 使 Http 服务未定义

    Using ngrx effectsv4 0 5 与 Angular v4 4 4 当我导入时EffectsModule in app module ts Http 服务变得未定义 一些代码 app module ts import Bro
  • iOS - 使用 URL 方案打开某些视图控制器

    我正在我的应用程序中使用 URL 方案 我轻松制作了一个来打开我的应用程序 只需将必要的项目添加到 info plist 即可 当前的 URL myappname 将用户带到初始视图控制器 FirstTableViewController
  • 随机添加到 Xcode 方案中的构建目标

    我正在使用 Xcode 5 和 CocoaPods 开发 iPhone 应用程序 我有一个计划和目标称为Oahu我对其进行测试 因此 看到我的两个测试目标在该方案的构建阶段构建 我并不感到惊讶 但是 有第四个构建目标无法删除 当我运行测试时
  • 在 TypeScript 的类方法中使用类型谓词

    我有一个这样定义的类 class Foo value string null constructor this value null private ensureValueExists this value is string type p