Javascript TSLint';属性不存在于类型';VS firefox调试器行为

Javascript TSLint';属性不存在于类型';VS firefox调试器行为,javascript,typescript,tslint,Javascript,Typescript,Tslint,第一:抱歉这个不准确的标题。我将澄清这个问题 在我的公司,我们使用TypeScript/React/JavaScript开发web应用程序。我使用VS代码作为启用tslint的IDE。我继续以前同事的工作 变量中存储有一个变量,并对其调用querySelector函数。目的是获取id为“someID”的元素/标记,并获取此元素的“offsetTop”值: // elem is the HTMLElement const tmp = elem.querySelector('[id=" + some

第一:抱歉这个不准确的标题。我将澄清这个问题

在我的公司,我们使用TypeScript/React/JavaScript开发web应用程序。我使用VS代码作为启用tslint的IDE。我继续以前同事的工作

变量中存储有一个变量,并对其调用querySelector函数。目的是获取id为“someID”的元素/标记,并获取此元素的“offsetTop”值:

// elem is the HTMLElement
const tmp = elem.querySelector('[id=" + someID + "');
const offset_top = tmp.offsetTop;
在VS代码中,tslint引发错误“类型“Element”上不存在属性“offsetTop”。这是因为querySelector返回类型为Element的元素,但属性“offsetTop”是为HtmleElement定义的

现在,当我使用Chrome调试器时,在“const tmp=…”行中断并通过将鼠标指针移到变量上显示“tmp”的属性,它将显示属性“offsetTop”

为什么?

提前谢谢

编辑

我现在的解决办法是:

const offset_top = tmp.firstChild.parentElement.offsetTop;

这是可行的,但我仍然对firefox调试器显示属性的原因非常感兴趣。

首先回答您的问题: 为什么tslint会提出这个问题类型“Element”上不存在属性“offsetTop”。这是因为Typescript定义了一些类型集、默认类型和自定义类型。对于typescript,元素是自定义类型,默认类型是number、string、boolean和any。因此,当您使用querySelector返回类型为Element的结果时,这反过来会将const tmp的类型更改为Element,因为您尚未为其声明任何类型
参考资料:
解决方案: 通过执行以下操作,自行设置常数的类型:

const tmp: any = elem.querySelector('[id=" + someID + "');
const offset_top = tmp.offsetTop;

这意味着通过将类型声明为“any”,我们可以绕过类型检查吗?这进一步意味着,这样的代码在执行时仍然可能失败(?)。是的,我们确实绕过了,但这并不意味着它会失败,通过声明类型,你对你的typescript语言说,你确切地知道你(程序员)在做什么。欢迎你,如果你发现这个答案已经回答了你的问题,那么一定要放弃投票,然后结束这个问题。