属性 'XYZ' 不存在于类型 'Readonly<{ children?: ReactNode; }> 和只读<{}>'

IT技术 javascript reactjs typescript visual-studio-code babeljs
2021-04-02 01:31:52

尝试访问 RecipeList.js 和 Recipe.js 的 .props 时出现语法错误。

这是 Recipe.js 的代码示例:

import React, {Component} from 'react';
import "./Recipe.css";

class Recipe extends Component {

    // props: any; uncommenting this will fix the bug

    render() {
        // don't have to use return and parentheses for arrow with JSX
        const ingredients = this.props.ingredients.map((ing, ind) => (
            <li key={ind}>{ing}</li>
        ));
        const {title, img, instructions} = this.props

        return (
            <div className="recipe-card">
                <div className="recipe-card-img">
                    <img src={img} alt={title}/>
                </div>
                <div className="recipe-card-content">
                    <h3 className="recipe-title">
                        {title}
                    </h3>
                    <h4>
                        Ingredients:
                    </h4>
                    <ul>
                        {ingredients}
                    </ul>
                    <h4>
                        Instructions:
                    </h4>
                    <p>
                        {instructions}
                    </p>
                </div>
            </div>
        )
    }
}

.props 错误截图

但是,该项目不会引发任何编译时错误,并且该网站运行良好。

应用程序运行良好且没有 chrome 控制台或终端错误的屏幕截图

我想这少了我的代码,更因此与typescript或某种预设配置使用Javascript有麻烦识别.props属性为每个组件,因为我有类似的问题,当我建立VScode做阵营教程项目进我的编辑器(为了确定起见,我什至从站点复制粘贴了最终的 index.js 代码),尽管该应用程序运行良好,没有编译时错误。

遵循 React 教程后相同 .prop 错误的屏幕截图

解决这个问题的唯一方法是,如果我真的硬编码并为每个类创建一个 props 属性并将其设置为任何像这样:

仅解决语法错误的截图

这是我更新的依赖项

"dependencies": {
  "@types/react": "^16.4.13",
  "prop-types": "^15.6.2",
  "react": "^16.5.0",
  "react-dom": "^16.5.0",
  "react-scripts": "1.1.5",
  "typescript": "^3.0.3"
 }
3个回答

您需要使用接口和 TypeScript 的 React.Component 通用实现来定义props和状态的外观

import React, {Component} from 'react';
import "./Recipe.css";

interface IRecipeProps {
  ingredients?: string[];
  title?: string;
  img?: string;
  instructions?: string;
}

interface IRecipeState {
}

class Recipe extends Component<IRecipeProps, IRecipeState> {
    render() {
        const ingredients = this.props.ingredients.map((ing, ind) => (
            <li key={ind}>{ing}</li>
        ));
        const {title, img, instructions} = this.props

        return (
            <div className="recipe-card">
                Your render code here
            </div>
        )
    }
}
  • 我会将文件扩展名更改为.tsx使用 TypeScript ->Recipe.tsx
  • 请调整类型(字符串)以适合您的数据。
  • 使用IRecipeState来定义你的组件状态的结构(this.state.fooBar)。现在可以将其留空,因为您不使用状态。
  • 确保您对其他引发错误的组件执行相同操作 ( RecipeList.js)

基于Klugjos 的回答。您可以对 React 的功能组件 (FC) 执行相同操作,并使用 useState Hook 来管理状态。

import React, {FC} from 'react';
import "./Recipe.css";

interface IRecipeProps {
  ingredients?: string[];
  title?: string;
  img?: string;
  instructions?: string;
}

interface IRecipeState {
}

const Recipe:FC<IRecipeProps> = (props) => {

    const { ingredients, title, img, instructions} = props;

    ingredients.map(( ingredient, index) => (
        <li key={index}>
          { ingredient}
        </li>
    ));

    return (
        <div className="recipe-card">
            Your render code here
        </div>
    )
}

您也可以通过以下方式解决此问题

class Recipe extends React.Component<any, any>{

....
....

// The rest of your normal code
}