【问题标题】:TSLint 'property does not exist on type' VS firefox debugger behaviorTSLint '类型上不存在属性' VS firefox 调试器行为
【发布时间】:2019-04-06 13:04:51
【问题描述】:

首先:很抱歉这个不准确的标题。我会澄清这个问题。

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

有一个HTMLElement 存储在一个变量中,并且在它上面调用了querySelector 函数。目的是获取 id 为“someID”的元素/标签,并获取该元素的“offsetTop”值:

// elem is the HTMLElement
const tmp = elem.querySelector('[id=" + someID + "');
const offset_top = tmp.offsetTop;

在 VS Code 中,tslint 引发错误“‘元素’类型上不存在属性‘offsetTop’”。这是因为 querySelector 返回了一个 Element 类型的元素,但是属性 'offsetTop' 是为 HTMLElement 定义的。

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

为什么?

提前致谢

编辑

我现在的解决办法是:

const offset_top = tmp.firstChild.parentElement.offsetTop;

这是有效的,但我仍然对为什么 firefox 调试器显示该属性非常感兴趣。

【问题讨论】:

    标签: javascript typescript tslint


    【解决方案1】:

    首先回答您的问题: 为什么 tslint 提出“'元素'类型上不存在属性'offsetTop'。这是因为 Typescript 定义了一些类型,默认类型和自定义类型。对于 typescript 元素是自定义类型,默认类型是数字,字符串,布尔值因此,当您使用返回类型为 Element 的结果的 querySelector 时,这又将 const tmp 的类型更改为 Element,因为您没有为它声明任何类型。
    参考:https://www.typescriptlang.org/docs/handbook/basic-types.html
    解决方案: 通过这样做自己设置常量的类型:

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

    【讨论】:

    • 这意味着通过将类型声明为“任何”我们绕过类型检查?这进一步意味着,这样的代码在执行时仍然会失败(?)。
    • 是的,我们确实绕过了,但这并不意味着它会失败,通过声明类型你对你的打字稿语言说你确切地知道你(程序员)在做什么。
    • 不客气,如果你发现这个答案已经回答了你的问题,那么请放弃投票并关闭这个问题。
    猜你喜欢
    • 2018-08-17
    • 2017-09-02
    • 2019-09-14
    • 2019-04-07
    • 2023-03-19
    • 1970-01-01
    • 2021-01-09
    • 2021-07-10
    相关资源
    最近更新 更多