在 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 的类方法中使用类型谓词 的相关文章

  • 如何解决函数签名中的“UndefVarError:T未定义”

    我正在尝试运行 其他人的代码 看起来像 function f T lt Number n Int alpha T beta T end 当 使用 该文件时我得到 UndefVarError T not defined Stacktrace
  • 在 Typescript 中隐式创建一个元组

    有没有一种方法无需类型提示即可在 Typescript 中创建元组 如果我只是这样做 const tuple 1 2 元组的类型number 我能得到的最接近的单线是 const tuple number number 1 2 我错过了什么
  • 如何声明具有可变数量属性的 TypeScript 接口?

    这是一个简单的问题 令我惊讶的是我在任何地方都找不到明确的答案 我正在制作一个 API 需要定义一个可以具有多个 字符串 属性的接口 但没有设置属性数量 也没有设置它们的名称 但它们都必须具有字符串值 因此以下所有对象都将与该类型匹配 sl
  • Webpack 与 typescript 获取 TypeScript 发出无输出错误

    我从这里得到了这个配置https www npmjs com package ts loader https www npmjs com package ts loader webpack config js var path requir
  • Angular 2 和 TypeScript 的承诺

    我正在尝试使用routerCanDeactivate我的应用程序中的组件的函数 简单的使用方法如下 routerCanDeactivate return confirm Are you sure you want to leave this
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 从 Java 中的泛型类型推断泛型类型(编译时错误)

    我有一个带有以下泛型类型签名的静态函数T public static
  • 角度按钮单击旋转图标

    我有以下按钮
  • Typescript 和 React 使用空类型数组设置初始状态

    假设我有以下片段 interface State alarms Alarm export default class Alarms extends React Component lt State gt state alarms 因为我想设
  • 是否有任何有角度的日期前管道?

    我正在尝试创建帖子共享网站 我想以角度创建日期前管道 import Pipe PipeTransform from angular2 core Pipe name messageTime pure false export class Me
  • 如何在Go中将字节数组转换为字符串[重复]

    这个问题在这里已经有答案了 byte字符串会引发错误 string byte n 也会引发错误 顺便说一下 例如 文件名的 sha1 值是字符串 它是否明确需要 utf 8 或任何其他编码集 谢谢 我用来转换的最简单方法byte to st
  • Typescript 从 CDN 导入 .js

    在我的 ts 文件中 我想引用 js 由第三方托管 并使用 js 文件中的一些函数 到目前为止 我发现如何做到这一点的唯一方法是修改 html 页面并插入 ts 本身的标签 除了修改 html 页面之外 还有其他更优雅的方法吗 听起来您正在
  • 如何指定 Express 响应返回的类型

    我正在尝试使用 TypeScript 标准化我的express js Web应用程序中的响应 但我不太确定如何全局设置响应应该是这个接口 success boolean data any error string 现在我只是在写 async
  • 到底什么是单例类型?

    什么是单例类型 有什么应用和影响 我们非常欢迎示例 更欢迎外行术语 如果将类型视为一组值 则值的单例类型x是仅包含该值的类型 x 用法示例 模式匹配 case Foo type检查匹配的对象是否与Foo using eq where cas
  • Angular 2 中的变更检测

    我正在将角度 1 和角度 2 集成在一起 因此我有角度 1 控制器和服务以及角度 2 组件 这些对于数据检索和存储来说工作得很好 反之亦然 下面是我的 html 页面 h3 Angular 1 service h3 div div
  • 使用占位符和 ngModel 动态生成输入元素

    我想以角度 2 动态生成输入元素 我有占位符标题数组和值数组 如下所示 在我的组件中 我有两个映射 如下所示 其中两个映射的键相同 将值映射到标题 const placeholderMap fullName Name value Produ
  • 如何在 TypeScript 中定义具有动态属性的对象的类型

    我有一个对象title作为字符串和orderas number 那么上面就会有动态数量的number类型的属性 所以我尝试像下面这样定义它 appraisalGroups Array lt title string order number
  • 打字稿中枚举声明中的方括号的含义是什么?

    我正在浏览一个名为 Angular ngrx 项目的打字稿文件collection ts在那里 我看到声明了以下枚举常量 import Action from ngrx store import Book from models book
  • Typescript导入别名+桶文件

    我最近花了很多时间 因为 Angular ngrx typescript 生态系统中某些事物的特定行为 并且我无法识别可能的根本原因 场景 我已经构建了一些效果 并将它们导出到桶文件中 index ts import MyEffects f
  • 如何循环 Record

    I have Records类型Record https www typescriptlang org docs handbook utility types html recordkt export interface List name

随机推荐

  • 带下拉菜单的角度过滤

    我有以下代码 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