美文网首页让前端飞Web前端之路
TypeScript 如何向 HTML DOM 元素扩展类型声明

TypeScript 如何向 HTML DOM 元素扩展类型声明

作者: 虚拟J | 来源:发表于2020-09-29 11:45 被阅读0次
问题

因为在 div 上用到 scrollTop 属性,所以 ts 报了下面的错误,说某个类型上不存在 scrollTop 属性

不能将类型“{ children: Element[]; className: any; scrollTop: number; ref: RefObject<HTMLDivElement>; }”分配给类型“IntrinsicAttributes & Pick<DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "children" | ... 253 more ... | "onTransitionEndCapture"> & { ...; }”。
  类型“IntrinsicAttributes & Pick<DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "children" | ... 253 more ... | "onTransitionEndCapture"> & { ...; }”上不存在属性“scrollTop”。

首先百度,但没有查到 ts 如何给 div 的声明增加一个属性。那只好自力更生了~
思路很简单,就是声明合并。

过程

从 div 进入到声明文件,可以看到。

HTMLDivElement,往下走,可以看到 HTMLDivElement 最后是有继承 scrollTop 属性的。

所以问题不在这里,进入 HTMLAttributes,可以发现,这里确实没有 scrollTop 属性的声明,要解决的就是这里了~

解决

最后加上下面的代码,就好了。

declare module 'react' {
    interface HTMLAttributes<T> {
        scrollTop?: number
    }
}
其他

因为有用到 ref,所以有过下面的报错。
先看一下对应的.d.ts里的内容。

类型 "null" 到类型 "HTMLDivElement" 的转换可能是错误的,因为两种类型不能充分重叠。如果这是有意的,请先将表达式转换为 "unknown"。

所以指定一下泛型,不要让类型推论自动推算就好:

const ref = useRef<HTMLDivElement>(null)
不能将类型“number | RefObject<HTMLDivElement>”分配给类型“RefObject<HTMLDivElement> | ((instance: HTMLDivElement | null) => void) | null | undefined”。
  不能将类型“number”分配给类型“RefObject<HTMLDivElement> | ((instance: HTMLDivElement | null) => void) | null | undefined”。

类型断言一下 as RefObject<HTMLDivElement> 就好了。

最后虽然写出来就一点,思路也很简单。但其实最上面的问题让我花费了一天时间,才醒悟找到问题点,解决完成~

相关文章

  • TypeScript 如何向 HTML DOM 元素扩展类型声明

    问题 因为在 div 上用到 scrollTop 属性,所以 ts 报了下面的错误,说某个类型上不存在 scrol...

  • 学习笔记-js-2017.2.25

    一、HTML DOM 元素(节点) 1、创建新的 HTML 元素如需向 HTML DOM 添加新元素,您必须首先创...

  • 改变 HTML 样式

    HTML DOM 允许 JavaScript 改变 HTML 元素的样式。如何改变 HTML 元素的样式呢? 语法...

  • DOM 重点核心

    文档对象类型:DOM1,对于JavaScript ,dom接口2,对于Html, dom 树包括文档,元素,节点...

  • 学习W3school的DOM教程

    总而言之,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。 DOM实例,学习全部DOM操作。

  • 创建新元素

    创建新的 HTML 元素 如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一个已存在...

  • JavaScript DOM编程(3)DOM元素(节点)

    创建新的 HTML 元素 如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一个已存在...

  • JavaScript高级程序设计笔记11

    DOM扩展 选择符API (1) (2) (3) 元素遍历 HTML5 (1) (2) (3) (4) (5) (...

  • HTML DOM 事件

    HTML DOM 事件 HTML DOM 事件 HTML DOM 事件允许Javascript在HTML文档元素中...

  • 【JS】20--Core DOM

    1. 节点关系 三种类型的节点 元素类型 文本类型 属性类型 操作html的三种方式 html方式 DOM核心方式...

网友评论

    本文标题:TypeScript 如何向 HTML DOM 元素扩展类型声明

    本文链接:https://www.haomeiwen.com/subject/thcjuktx.html