在 Typescript 中为“this”关键字键入注释

2024-04-13

我有一个独立的函数,旨在使用提供的上下文Function.prototype.call.

例如:

function foo () {
    return this.bar;
}

> foo.call({bar: "baz"})
baz

有没有办法为以下内容提供 Typescript 类型注释this这种情况下的关键字?


首先,你可以使用特殊的this范围 https://www.typescriptlang.org/docs/handbook/2/classes.html#this-parameters语法来识别您期望的对象类型this to be:

function foo (this: {bar: string}) {
    return this.bar; // no more error
}

如果您直接调用它,这会有所帮助:

foo(); // error, this is undefined, not {bar: string}

var barHaver = { bar: "hello", doFoo: foo };
barHaver.doFoo(); // acceptable, since barHaver.bar is a string

var carHaver = { car: "hello", doFoo: foo };
carHaver.doFoo(); // unacceptable, carHaver.bar is undefined

TS3.2+ 更新

TypeScript 3.2 推出the --strictBindCallApply编译器选项 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-2.html#strictbindcallapply它强类型化了函数的 .call() 方法。如果你使用这个(或the --strict编译器功能套件 https://www.typescriptlang.org/tsconfig/#strict其中包括这个),那么this参数也将强制执行foo.call()按预期行事:

foo.call({ bar: "baz" }); // okay
foo.call({ baz: "quux" }); // error!

TS3.2 之前的答案如下:

但你想用foo.call()。不幸的是Function.prototype.call()输入 TypeScript 并不会真正为您强制执行此限制:

foo.call({ bar: "baz" }); // okay, but
foo.call({ baz: "quux" }); // no error, too bad!

将更好的东西合并到 TypeScript 中Function声明给我带来了问题,(第一点丑陋;你需要强制转换foo到某事)所以你可以尝试这样的事情:

interface ThisFunction<T extends {} = {}, R extends any = any, A extends any = any> {
  (this: T, ...args: A[]): R;
  call(thisArg: T, ...args: A[]): R;
}

A ThisFunction<T,R,A>是一个函数this类型的T,类型的返回值R,以及类型的剩余参数A[]。 (丑陋的第二点:您无法轻松地以类型系统强制执行的方式指定不同类型的多个参数。)

然后您可以投射foo to ThisFunction<{ bar: string }, string>,(丑陋的第三点:类型系统不会推断this类型),然后最后使用call():

(<ThisFunction<{ bar: string }, string>>foo).call({ bar: "baz" }); // okay, and
(<ThisFunction<{ bar: string }, string>>foo).call({ baz: "quux" }); // error, hooray!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Typescript 中为“this”关键字键入注释 的相关文章

  • 如何在javascript中动态向对象数组添加值?

    这是一个对象数组 var data label 1 value 12 label 1 value 12 label 1 value 12 label 1 value 12 我如何动态地为这些添加值 我尝试了以下代码但没有成功 var lab
  • 如何使用 JavaScript 刷新页面?

    如何使用 JavaScript 刷新页面 Use location reload https developer mozilla org en US docs Web API Location reload 例如 每当元素带有以下内容时重新
  • 返回上一页

    我正在使用表格来 评价 页面 此表单将数据 发布 到其他地方的 php 脚本 我只是想在处理表单后显示一个链接 这将使用户返回到上一页 我可以在 php 脚本中使用 javascript 来执行此操作吗 GF 您可以使用链接来调用histo
  • 调用类实例方法 onclick javascript

    我有一个 javascript 文件 其中包含包含方法函数的类 我想知道如何从 onClick 事件调用类实例方法 function MyClass this instanceData Display Me this DisplayData
  • Dialogflow Fulfillment Webhook 调用失败

    I am new to dialogflow fulfillment and I am trying to retrieve news from news API based on user questions I followed doc
  • Chrome 开发工具命中代码但未命中断点

    我在 chrome 开发工具上启用了断点 并且在一行上有一个断点 我知道 chrome 正在运行 因为我将断点放在具有以下语句的行上 alert why is this not breaking 如果我在本地主机中找到该文件 则断点有效 断
  • 角度垫排序不适用于带点表示法的 matColumnDef

    我正在尝试按列对表进行排序 当我必须过滤另一个结果中的结果时 就会出现问题 我尝试通过括号表示法和点表示法访问该属性 但没有给出结果 还将最终节点放置在 matColumnDef 中 但失败 因为有 2 列同名 table table
  • Pjax动画

    我终于让 pjax 工作了 但我还有另一个问题 如何添加一些 jquery 动画 如淡出 幻灯片旧内容和淡入 幻灯片新内容 默认情况下 pjax 只是更改内容 没有任何好看的效果 任何帮助将非常感激 此致 基本上 你有一堆事件 https
  • 修改 Twitter 帖子上可编辑 Div 的内容

    我正在编写一个 chrome 扩展 它可以帮助用户在 Twitter 上输入内容 当在 twitter 上写推文时 twitter 会打开一个可编辑的 div 容器 当用户输入内容时 twitter 大概正在使用某些网络框架 会生成子 di
  • 如何根据另一个下拉列表中的选择动态填充下拉列表中的选项?

    我有一个表 其中包含类别信息 例如产品 我已将它们列在下拉菜单中 现在 我需要做的是 在下一个下拉菜单中列出所选类别的子类别 我希望 javascript 是必需的 但我对 javascript 还不太熟悉 将非常感谢您的帮助 你应该使用
  • 嵌套 DIV 的类似斑马的 CSS 样式

    我嵌套了 DIV 元素 但我不知道嵌套的级别 我需要每个都有与其父级不同的背景 创建类似斑马的颜色 我只使用两种背景 深色和白色 效果需要类似于在容器中设置奇数和偶数子级的样式 但在我的例子中 子级是嵌套的 我可以使用每个嵌套元素的规则来做
  • 为现有模块创建 d.ts 文件

    我正在尝试创建一个d ts文件为React 静态容器 https github com reactjs react static container图书馆 NPM 中安装的库如下所示 var React require react var
  • D3 向对象添加超链接?

    我正在尝试制作 D3 图 它将代表我网站的菜单 我尝试按照此处的其他指南添加超链接 但它们都不起作用 每个对象都会有一个不同的 URL 指向 主页 关于 联系方式等 如果添加超链接 我可以拖动对象吗 这意味着如果我按住单击 如果我单击该对象
  • 在 React Web 应用程序中使用 createjs-soundjs

    我想用https www npmjs com package createjs soundjs https www npmjs com package createjs soundjs在 React Web 应用程序上播放声音 我正常安装了
  • 标记(Markdown)+ Mermaid(流程图和图表)

    努力去争取 美人鱼 https github com knsv mermaid https github com knsv mermaid跟 共事 标记 https github com chjj marked https github c
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 如何使用 javascript 更改文件扩展名

    有谁知道在 Javascript 中更改文件扩展名的简单方法吗 例如 我有一个带有 first docx 的变量 但我需要将其更改为 first html 这将改变字符串包含文件名 let file first docx file file
  • 区分 NaN 输入和输入类型为“number”的空输入

    我想使用 type number 的表单输入 并且只允许输入数字
  • $ 在 JQuery 中意味着什么

    在下面的 var obj one 1 two 2 three 3 four 4 five 5 each obj function i val console log val 这里是什么意思 是对象吗 是一个别名jQuery对象 函数 它充当
  • 为什么 try catch 块没有捕获 Promise 异常?

    我对承诺的错误处理感到困惑 答案可能很明显 但我不明白 我有以下示例代码 var test async function throw new Error Just another error try test then catch err

随机推荐

  • 垃圾收集和 JNI 调用

    我遇到 JNI 程序随机内存不足的问题 这是一个 32 位 java 程序 它读取文件 进行一些图像处理 通常使用 250MB 到 1GB 然后 所有这些对象都会被丢弃 然后程序对 JNI 程序进行一系列调用 通常需要 100 250MB
  • 转换为Weka日期格式

    我有一个带有一些属性的 csv 文件 一种是日期属性 日期采用这种形式 yyyy mm dd hh mm ss 但 Weka 将其视为名义类型而不是日期类型 如何解决这个问题 请在这件事上给予我帮助 我用Weka资源管理器 一个很好的参考
  • 执行 `brew tap exolnet/homebrew-deprecated` 时出错

    我要安装 电子邮件受保护 cdn cgi l email protection在我的 MacBook Pro 和 Macos M1 上 我想执行以下步骤 brew tap exolnet homebrew deprecated brew i
  • OpenCV - 如何在 iOS 上将自适应阈值应用于图像

    我正在尝试将自适应阈值应用于 A4 纸的图像 如下所示 我使用下面的代码来应用图像处理 UIImage processImageWithOpenCV UIImage inputImage cv Mat cvImage inputImage
  • 将 jQuery 加载到 chrome-extension 中

    我正在尝试迈入 Chrome 扩展的神奇世界的第一步 现在我已经构建了我的清单并尝试加载jquery name Test Extension version 0 1 manifest version 2 description First
  • 删除表中的重复条目[重复]

    这个问题在这里已经有答案了 我想从下表中删除多个重复的键 id name uid 1 ekta 5 2 ekta 5 3 sharma 10 4 sharma 10 希望它像 id name uid 1 ekta 5 3 sharma 10
  • 如何从点击事件中知道是否选择了垫选项?

    我有多个mat select并想知道是否mat option所单击的内容已被选择或取消选择 这 event target对象传递时 click 被解雇 没有selected我可以使用的属性
  • 在图表上绘制单点

    我有一个小提琴图 如下所示 我想在小提琴顶部的每个 x 值上绘制一些单独的点 或线 十字 点 以最简单的为准 如下所示 我该怎么做呢 这是制作小提琴图的代码 参见使用 Matplotlib 绘制小提琴图 http pyinsci blogs
  • 使用div和jquery连续循环

    我正在继续一个上一篇文章 https stackoverflow com questions 1748656 images sliding continuously with table and jquery 但我想我应该打开一个新线程 因
  • 是否可以将实体框架与 Windows Azure 开发存储服务一起使用?

    编辑 是否可以将实体框架与 Windows Azure 开发存储服务一起使用 如何 Thanks 不 这是不可能或不切实际的 Azure 存储 与 SQL Azure 不同 不支持加入 并且可能无法很好地响应即席查询 但你不需要它 Azur
  • 覆盖 ZipArchiveEntry 的内容

    如何覆盖 a 的内容ZipArchiveEntry 以下代码使用StreamWriter with StringBuilder如果新文件内容比原始文件内容短 则会失败 例如 using System IO Compression using
  • Git 1.8:推送错误:dst ref refs/heads/master 从多个 src 接收

    git 1 8 的另一个问题 git push error dst ref refs heads master receives from more than one src error failed to push some refs t
  • 如何使用加密的 DLQ 将重新驱动策略添加到 SNS

    我有一个 SNS 用 KMS 加密 由两个 lambda 订阅 我正在尝试向其中一项订阅添加重新驱动策略 相关 DLQ 已加密 添加重新驱动策略会出现错误 无法检查 Amazon SQS 队列权限 确保队列存在并且您的帐户有权读取队列的属性
  • 捏合 MKMapView 时保持中心坐标

    如果您在跟踪设备位置时在 Apple 地图应用程序中进行捏合放大 缩小 则捏合手势的 平移 部分将被忽略 蓝色位置指示器将保持固定在屏幕中央 使用普通的时情况并非如此MKMapView 假设我已经有了用户的位置 我怎样才能达到这个效果呢 我
  • 如何对多种文件类型使用 grep --include 选项?

    当我想 grep 某个目录中的所有 html 文件时 我执行以下操作 grep include html pattern R some path 效果很好 问题是如何grep某个目录中的所有html htm php文件 由此使用 grep
  • Android中如何使用Intent在Activity之间传递值?

    我想将一个活动类别中的位置值传递给另一个活动类别 我的代码如下 protected void onListItemClick ListView listView View v int position long id switch posi
  • Swing UI 线程是何时创建的?

    在运行 Swing 程序的过程中 什么时候 UI 线程 事件调度线程 EDT 首先产生 想必任何给定的 JVM 都可以做任何它想做的事 例如 始终在启动时生成 EDT 无论 或从未使用过 但作为一个实际问题 当 通常会创建 EDT 吗 它是
  • 如何使用 NHibernate 的 criteria api 和实体查询子属性以仅加载与谓词条件匹配的子属性

    假设如下 public class Order public virtual int OrderId get set public virtual ISet
  • 向由 proc_open() 打开的进程发送信号

    我们这里有一个实用程序正在使用proc open 调用 ssh 在远程计算机上运行命令 然而 在某些情况下 我们需要停止远程机器上的命令 但是proc close and proc terminate 不要将所需的信号发送到 ssh 连接的
  • 在 Typescript 中为“this”关键字键入注释

    我有一个独立的函数 旨在使用提供的上下文Function prototype call 例如 function foo return this bar gt foo call bar baz baz 有没有办法为以下内容提供 Typescr