TS2339:“家”类型上不存在属性“props”

IT技术 reactjs typescript
2021-04-20 19:37:45

我有一个非常基本的与 tsx react的程序,我收到一个错误,我无法弄清楚为什么

import React from 'react';
// import {connect} from 'react-redux'

export class Home extends React.Component {    
    render(){
        console.log(this.props)
        return (
            <div>Working</div>
        )
    }
}


import * as React from 'react'
import * as ReactDOM from 'react-dom';
import {Home} from './Components/Home.component'
class App extends React.Component<any,any>{
render(){
    return(
        <Home value="abc" />
    )
  }
}
ReactDOM.render( <App />, window.document.getElementById("app"))

git的克隆这个代码

2个回答

在拉下你的 repo 并检查它之后,我意识到你没有typescriptreact 类型

Typings 是管理和安装 TypeScript 定义的简单方法

添加这一行

"@types/react": "^16.0.25" // or another version you prefer

package.json并运行,npm i或者yarn如果您使用纱线作为包管理器,再一次解决了该问题。

试试看,让我知道这是否能解决你的问题:)

PS:TypeScript 要求您描述对象和数据的形状。如果您查看我之前提供其他答案,它几乎是一个冗长而复杂的版本您需要指定一个描述您的props的类型并需要将其传递给相关组件

我早些时候尝试过它不起作用,但现在它起作用了。非常感谢您的时间和精力
2021-06-04 19:37:45
似乎是什么问题@Audiopolis
2021-06-06 19:37:45
@Siya 我的情况几乎与 OP 完全相同,但是添加反应类型并没有解决错误。然而,定义道具的形状确实解决了这个问题。也许我有更严格的配置什么的。我是 TypeScript 的新手,所以我相信我很快就会理解得更好。谢谢回复!
2021-06-07 19:37:45
我已经在 devDependencies 中定义了这个,我正在尝试添加依赖项让希望
2021-06-15 19:37:45
对不起,我不明白
2021-06-16 19:37:45

typescript需要知道的形状props,并state传递给组件。如果你真的想阻止 Typescript 在你的组件中强制输入(顺便说一句,这违背了使用 Typescript 的全部目的),那么,需要访问propsstate传递给它的组件必须指定类型或形状可以这么说,作为any也就是说,你的组件看起来像这样

export class Home extends React.Component<any, any>

代替

export class Home extends React.Component

顺便说一句,如果该类期望props和/或state.

传递any类型propsstate装置所讨论的组件必须接受两个任何类型的形状(类型)的propsstate

试试这个

import * as React from "react";
import * as ReactDOM from 'react-dom';

export class Home extends React.Component<any, any> {
  render() {
    console.log(this.props)
    return (
      <div>Working</div>
    )
  }
}

class App extends React.Component{
  render() {
    return (
      <Home value="abc" />
    )
  }
}

ReactDOM.render(<App />, document.getElementById("app"));

一切都应该按预期工作,因为您在类型检查方面让 Typescript 不受影响。

您也可以在此处查看演示

如果您确实想要强制执行props和/或的形状(类型),那么state您通常必须使用interface内联类型注释来定义这些形状这是上面相同代码的示例,它使用前一种方法强制props的形状:

import * as React from "react";
import { render } from "react-dom";

interface Props {
  value:string,
  name:string
}

export default class Home extends React.Component<Props>{
  render() {
    console.log(this.props)
    return (
      <div>Working. The props values are: {this.props.value} {this.props.name}</div>
    )
  }
}

class App extends React.Component {
  render() {
    return (
      <Home value="abc" name="def"/>
    )
  }
}

render(<App />, document.getElementById("root"));

现在,在这里您永远无法向接口中未定义propHome组件添加任何其他组件Props例如做这样的事情:

<Home value="abc" name="DEF" somethin="else"/>

不会编译,因为somethin未在组件interface使用的 中定义Home

要强制执行 的形状,state您必须执行与 相同的操作props,即定义合同(接口)。另外,请注意,您仍然需要props通过thisNOT访问您的via NOT,Props因为这只是结构的类型定义,而不是值本身的持有者。

您可以在此处查看此替代方案的演示

您在哪个版本的 Typescript 中遇到上述错误?它是您编写的不需要 props 或 state 结构的组件的同一个版本吗?
2021-05-23 19:37:45
好吧,我已经对此进行了测试,如果没有在某处定义道具的形状,它就无法工作。它唯一有效的时间是当我命令组件接受任何类型的道具时。
2021-06-03 19:37:45
我不认为这是一个问题,为 props 创建一个接口并定义 prop 类型只是为了验证,我已经创建了没有接口 props 的组件,它曾经可以正常工作
2021-06-08 19:37:45
我的依赖项 "css-loader": "^0.28.7", "react": "^16.1.1", "react-dom": "^16.1.1", "react-redux": "^5.0.6 ", "redux": "^3.7.2", "style-loader": "^0.19.0", "ts-loader": "^3.1.1", "typescript": "^2.6.1", "webpack": "^3.8.1", "webpack-dev-server": "^2.9.4"
2021-06-14 19:37:45
好的谢谢。您是否尝试过上面建议的方法?此外,您不需要为道具创建界面。这是答案的第二部分,我提到当且仅当您想为道具和/或状态强制实施某种结构时,您才会采用这种方法
2021-06-19 19:37:45