我正在用打字稿构建一个ReactJS应用程序。我在特定的TSX文件中遇到编译器错误,因为它认为我的onMouseDown处理程序的类型不正确:
Type '(event: MouseEvent<Element, MouseEvent>) => void' is not assignable to type '(event: MouseEvent<HTMLDivElement>) => void'
从我的调查来看,问题似乎是由于React版本不匹配造成的。看来此MouseEvent处理程序的类型已在较新的react版本中更改。
我的应用程序当然也依赖于react和@ types / react。但是,我的应用程序还依赖于另一个我们称为“ foo”的程序包。如果我在node_modules目录中的'foo'目录中查找,则'foo'也有其自己的node_modules目录,该目录下带有@ types / react-一个比我的应用程序直接依赖的目录还早的目录。
当我尝试从我的TSX文件的函数中返回元素时,它似乎正在使用 older JSX.IntrinsicElements接口中的定义,该接口位于foo下的node_modules目录下。但是,ReactElement的定义(我的函数返回的类型)似乎来自 new JSX.IntrinsicElements。这样,就会发生冲突,因为较旧的类型与较新的ReactElement类型(特别是MouseEvent)的定义不匹配。
我通过更改函数以使用React.createElement(“ div” ...)返回div进一步验证了我的理论,并且使错误消失了,因为在那里使用的“ React”显式引用了React包我的tsx文件是从顶部导入的-从而避免了从JSX.InstrincicElements自动查找类型。
所以我的问题是-当存在多个时,打字稿(和VS Code)如何决定使用哪个JSX.IntrinsicElements定义?并且有什么方法可以使它使用来自显式列为我的项目依赖项的react包中的那个包,而不是恰好位于另一个巧合也使用react类型的模块下的包? / p>
谢谢!