2016-11-17 39 views
1

我使用打字稿2和TSX与维护(不反应)制定和“noImplicitAny”启用:打字稿2 TSX维护和noimplicitany错误TS2602:全球型“JSX.Element”不存在

"noImplicitAny": true, 
"jsx": "preserve" 

的问题是,我不断收到试图建立一个简单的TSX文件时,这个错误:

error TS2602: JSX element implicitly has type 'any' because the global type 'JSX.Element' does not exist. 

这是我的TSX文件的例子:

'use strict'; 

import m from './m'; 

export default { 
    view() { 
    return (
     <h1>Hello Mithril!</h1> 
    ); 
    } 
}; 

我试图让TSX与一个非React堆栈(秘银)一起工作。提前致谢!

回答

1

回答到原来的问题:(如何解决TS2602错误)

这很简单,因为explained here

由于错误说:“由于全球型“JSX。元素”不存在”

您可以定义这些类型:

declare namespace JSX { 
    interface Element { } 
    interface IntrinsicElements { div: any; } 
} 

我建议从DefinitelyTyped

得到反应,jsx.d.ts文件可以使用this file作为源更完整的分型(你需要定义为每个子元素IntrinsicElements,即divpa等)

掌握TSX和秘银更远:

一旦你解决了打字问题,你会发现你并不在那里。如果使用"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"并使用巴别,as described in mithril documentation,翻译的jsx文件(其由打字稿从tsx文件产生)为一个有效的文件js。最终,我设法让它工作,但是我发现这个过程非常混乱,打字稿/ npm模块系统让JSX类型扩展了Mithril类型(这样你的函数可以返回mithril兼容类型)等。我不得不修改mithril类型(并删除npm @types/mithril),并添加我自己的几个模块。

我很想知道是否某人以优雅和简单的方式解决了这个问题!

0

由于缺乏声誉,它不会让我评论上面的youen的答案,所以我会将其包含在我自己的答案中。

首先,您可以在项目的顶部包含this gist,并将其命名为mithril-jsx.d.ts,这样打字稿会将其视为类型定义并且不会对其进行编译。链接的要点只是将JSX.element声明为m.Vnode<any, any>,并将JSX.IntrinsicElements下的每个HTML元素列为any。没有什么大不了,但节省了时间。

二,原因我甚至张贴这样的:你做需要吞掉或任何其他工具来编译.tsx文件.js者使用秘银,。所有你需要做的就是在你对编译器选项这里tsconfig.json

{ 
    "compilerOptions": { 
    //...your other stuff here 
    "jsx": "react", 
    "jsxFactory": "m" 
    } 
} 

更多信息指定这些:http://www.typescriptlang.org/docs/handbook/compiler-options.html

+0

嘿漂亮的提示,我不知道有关“jsxFactory”选项。我正在使用''jsx“:”react“',然后在运行时创建一个封装来调用'm'。但是它输出实际的mithril兼容语法吗?因为我认为反应需要一个儿童参数列表,而mithril只需要一个参数,这个参数是一个数组? – youen