第一:抱歉,标题不准确。我会解决这个问题。
在我公司,我们使用TypeScript / React / JavaScript开发Web应用程序。我使用VS Code作为启用了tslint的IDE。我继续前同事的工作。
在变量中存储了HTMLElement,并在其上调用了querySelector-function。目的是获取ID为“ someID”的元素/标签,并获取该元素的“ offsetTop”值:
// elem is the HTMLElement
const tmp = elem.querySelector('[id=" + someID + "');
const offset_top = tmp.offsetTop;
在VS Code中,tslint引发错误“类型'Element'上不存在属性'offsetTop'。”这是因为querySelector返回类型为Element的元素,但是为HTMLElement定义了属性“ offsetTop”。
现在,当我使用Chrome调试器时,在'const tmp = ...'行处中断,并通过将鼠标指针移到变量上来显示'tmp'的属性,它显示了属性'offsetTop'。 / p>
为什么?
预先感谢
修改
我现在的解决方法是:
const offset_top = tmp.firstChild.parentElement.offsetTop;
正在运行,但是我仍然对为什么firefox调试器显示该属性非常感兴趣。
答案 0 :(得分:1)
首先回答您的问题:
为什么tslint会提出类型“元素”上不存在“属性'offsetTop'。这是因为类型脚本定义了一些类型集,默认类型和自定义类型。对于类型脚本,元素是自定义类型,默认类型是数字,字符串,布尔值因此,当您使用querySelector返回一个类型为Element的结果时,这又将const tmp的类型更改为Element,因为您尚未为其声明任何类型。
参考:https://www.typescriptlang.org/docs/handbook/basic-types.html
解:
自己设置常量的类型,方法如下:
const tmp: any = elem.querySelector('[id=" + someID + "');
const offset_top = tmp.offsetTop;