如何将 D3 JavaScript 中的“this”翻译成 TypeScript?

IT技术 javascript typescript d3.js arrow-functions lexical-scope
2021-02-17 21:16:09

我知道 JavaScript 中的'this' 与 TypeScript 中的含义不同,根据这篇文章TypeScript 中的 'this'我在 JavaScript 中有以下代码用于在所选节点上创建较粗的笔划,并为所有其他节点提供较小的笔划。

node.on('click', function (d) {
   d3.selectAll('circle').attr('stroke-width', 1.5);
   d3.select(this).select('circle').attr('stroke-width', 5);
})

在typescript中我有

this.node.on('click', (d:any) => {
   this.node.selectAll('circle').attr('stroke-width', 1.5);
   [this is where I need help].select('circle').attr('stroke-width', 5);
}
3个回答

正如已经指出此评论这个答案this不能有JavaScript和typescript之间有不同的含义。

话虽如此,您的问题在这里更加平淡无奇:您试图this在箭头函数中使用来获取当前的 DOM 元素,但这根本行不通。

所以,简而言之,这里的问题是this箭头函数和常规函数之间的区别,而不是 TypeScript 和 JavaScript 之间的区别

解决方案

有一个替代方法this,在 API 中随处描述:当您在大多数 D3 方法中使用匿名函数时,传递的参数是......

... 当前数据 (d)、当前索引 (i) 和当前组(节点),this作为当前 DOM 元素(节点 [i])。

因此, this只是节点组(第三个参数)的当前索引(第二个参数)。

所以,在下面的片段中:

selection.on("foo", function (d, i, n){
    console.log(this)
    console.log(n[i])
})

两者console.log将返回相同的东西。

当您使用箭头函数时,解决方案是(在 JavaScript 中):

this.nodes.on("click", (d, i, n) => {
    d3.select(n[i])//rest of your code here
})

如果您想了解更多关于使用第二个和第三个参数来获取 DOM 元素的信息,请查看此示例:d3 v4 当 `t​​his` 不可用时,从拖动回调中检索拖动 DOM 目标

对它实际上并没有那么多关于它编译为 JavaScript 的问题。例如,Dart 也是如此,但 Dart 的处理方式this有所不同。这是关于 TypeScript 是JavaScript超集这就是语言的定义。这意味着所有 JavaScript 构造都具有相同的含义,不是在编译输出中,而是在源代码级别。
2021-04-22 21:16:09
@AluanHaddad 谢谢你这么说。因为我从未使用过 TypeScript,所以我不想肯定地说任何事情,但是是的,因为 TypeScript 编译为纯 JavaScript,所以声称没有任何意义。
2021-04-23 21:16:09
不管这个问题在 JavaScript 和 TypeScrip 之间是不同的(我怀疑)我只想说你怀疑是正确的。OP 中的说法是 100% 错误的。没有自己的任何行为之间的区别。
2021-05-05 21:16:09

这个问题的前提,How to translate 'this' in D3 JavaScript to TypeScript?,是假的。我没有反对,因为教育很重要。

我只是想澄清一下this,TypeScript 和 JavaScript 是 100% 相同的

事实上,所有也是有效的 JavaScript 语法的 TypeScript 语法都具有完全相同的语义。

这就是使 TypeScript 成为 JavaScript 超集的原因。

更新:我实际上会用一个答案来修正这个,因为问题是你认为意思不同。您对箭头函数语法感到困惑

(params) => expression or block

首先=>不是 TypeScript 特性,而是 JavaScript 特性。

其次,如上所述,TypeScript 自然支持这两种形式。这意味着不需要翻译。

this 在 TypeScript 中与在 JavaScript 中的含义相同。

在这两种语言就意味着在上下文不同的东西=>比它的背景下functionSO上有很多很多答案解释了这一点,所以我不会重复它们。

所以这里是这个问题的答案。

如果你有这个文件:

d3-app.js

node.on('click', function (d) {
  d3.selectAll('circle').attr('stroke-width', 1.5);
  d3.select(this).select('circle').attr('stroke-width', 5);
});

它有效并且您想用 TypeScript 重写它。

这是你要做的:

  1. d3-app.js重命名d3-app.ts

就这些。

答案是用“d3.event.currentTarget”替换“this”

d3.select(d3.event.currentTarget).select('circle').attr('stroke-width', 5);
看我的回答,我解释了如何在 TypeScript 中“重写”它
2021-05-01 21:16:09
实际上看@GerardoFurtado 的回答,他有更多的 d3 知识。
2021-05-13 21:16:09