回答原始问题:(如何解决 TS2602 错误)
这很简单,如下所述:
正如错误所说:“因为全局类型'JSX.Element'不存在”
您可以定义这些类型:
declare namespace JSX {
interface Element { }
interface IntrinsicElements { div: any; }
}
我建议从DefiniteTyped 获取react-jsx.d.ts 文件
您可以将此文件用作更完整类型的源(您需要定义 IntrinsicElements 中的每个子元素,即div
, p
,a
等)
使用 TSX 和 Mithril 走得更远:
一旦你解决了打字问题,你会发现你并不完全在那里。如果使用该"jsx": "preserve"
设置,HTML 代码将直接写入生成的js
文件中,无需任何翻译。这当然不能由网络浏览器加载(因为它是一个 javascript 文件,而不是一个 html 文件)。
我认为有两种方法可以使它工作:
想到的第一个解决方案是使用"jsx":"react"
并编写一个小型包装器,它将调用转发到秘银,如下所示:
class React {
public static createElement(selector: string, attributes: object, ...children: Mithril.Child[]): Mithril.Child {
return m(selector, attributes, children);
}
}
这是我目前使用的解决方案,因为它不涉及其他工具。
另一种解决方案是保留"jsx":"preserve"
和使用 Babel,如秘银文档中所述,将jsx
文件(由 typescript 从tsx
文件生成)转换为有效js
文件。
最后,我设法让它工作,但我发现这个过程相当混乱,打字稿/npm 模块系统阻碍了 JSX 类型扩展秘银类型(这样你的函数可以返回秘银兼容类型)等。我不得不修改秘银类型(并删除 npm @types/mithril
),并添加一些我自己的模块。
我很想知道是否有人以一种优雅而简单的方式解决了这个问题!