使用React.createClass时,类型'抱怨'在'JSX.IntrinsicElements'类型中不存在?

rog*_*ger 17 typescript reactjs redux

我正在使用typescript来编写redux应用程序.

var item = React.createClass({
  render: function() {
    return (<div>hello world</div>)
  }
});

export default class ItemList extends Component<any, any> {
    render() {
        return (<item />)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后打字稿抱怨这个:

Property 'item' does not exist on type 'JSX.IntrinsicElements'.
Run Code Online (Sandbox Code Playgroud)

Jka*_*nen 32

对于其他坚持这一点的人。

解决方案是

rm -rf node_modules
npm install
Run Code Online (Sandbox Code Playgroud)

打字稿抱怨

Property 'div' does not exist on type 'StyledInterface'.
Run Code Online (Sandbox Code Playgroud)

和

Property 'div' does not exist on type 'JSX.IntrinsicElements'.
Run Code Online (Sandbox Code Playgroud)

我认为根本原因是 vscode (我)不小心编辑了 node_modules 中的类型定义。

  • 我同意,当在组件上使用重构功能时,vscode 确实会重命名类型定义,例如 `&lt;button&gt;` → `&lt;a&gt;` (8认同)
  • 换句话说,您在标签上按 F2 将其更改为其他内容,并且您在类型定义中逐字重命名。`npm uninstall @types/react` 和 `npm install --save-dev @types/react` 为我做到了。 (3认同)

Sin*_*pcs 23

您可以像这样声明您的自定义元素类型:

import * as React from 'react'

declare global {
  namespace JSX {
    interface IntrinsicElements {
      item: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。只是为了防止它不明显,如果您的自定义组件被命名为“my-item”,那么语法是 ['my-item']: React.DetailedHTMLProps... (2认同)

jsi*_*ina 22

那是因为你的item组件名称不是以大写字母开头,导致 Typescript 报错。替换item为Item可以解决这个问题。


Raj*_*bat 21

var Item = React.createClass({
  render: function() {
    return (<div>hello world</div>)
  }
});

export default class ItemList extends Component<any, any> {
    render() {
        return (<Item />)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为了清楚未来的面孔,诀窍是`Item`中的大写字母`I`.我们所有人都在这里尝试相同的判断失败,试图找到一个反应元素.如果你正在阅读这篇文章,你可能会被剥夺足够的资源而错过大写字母. (30认同)

小智 8

对于所有遇到类似错误的人:

Property 'div' does not exist on type 'JSX.IntrinsicElements'.
Run Code Online (Sandbox Code Playgroud)

或者任何其他标签来代替 div。如果其他解决方案没有帮助,请尝试添加到tsconfig.json:

...    
"compilerOptions": {
    "moduleResolution": "node"
    }
...
Run Code Online (Sandbox Code Playgroud)


Jam*_*com 7

请记住:“item”在 TypeScript 中无效,您必须声明为“Item”,首字母大写!它会像:

var Item = React.createClass({
  render: function() {
    return (<div>hello world</div>)
  }
});
Run Code Online (Sandbox Code Playgroud)

再会!


Bli*_*itz 7

对于遇到此问题并且之前的答案不起作用的其他人,.tsx由于tsconfig.json文件配置错误,这种情况也可能发生在文件中。

我遇到了以下错误:

...
"compilerOptions": {
   "jsx": "react-jsx"
}
...
Run Code Online (Sandbox Code Playgroud)

并通过将其更改为解决了它:

...
"compilerOptions": {
   "jsx": "react"
}
...
Run Code Online (Sandbox Code Playgroud)

div同样,上面的答案可能是首先要检查的事情,但如果您在标准 HTML 元素(如、等)上遇到这些错误,span并且您正在使用 Typescript。检查你的 tsconfig.json!


Bro*_*nek 6

看起来我在这个问题中遇到了同样的问题,但它是错字:/但我决定在这里分享,因为错误看起来非常相似,谷歌把我带到了这里。

我在声明中有错字:

declare global {
    namespace JSX {
        interface IntrinisicElements {
            'about-me': { me: string }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是IntrinsicElements我有IntrinisicElements('Intrin' 后面的额外的 'i' 字母)。编译器没有抱怨,因为它是接口的定义,所以名称可以由我们选择。

错误是这样的:

类型“JSX.IntrinsicElements”上不存在属性“about-me”。