TypeScript版Create React App组件报错:JSX子元素类型不符
TS2746错误排查:JSX标签children属性类型不匹配问题
使用命令npx create-react-app . --template typescript创建全新TypeScript React项目后,在SchemesSelector.tsx组件的div标签处触发TS2746错误,提示:该JSX标签的'children'属性期望单个ReactNode类型子元素,但提供了多个。以下是组件代码和package.json配置,尝试多种在线方案未解决,求排查问题所在。
组件代码
import React from 'react'; interface Scheme { id: number, display_name: string, } export interface Props { schemes: Array<Scheme>; } const SchemesSelector = (props: Props) => { return ( <div> <p>Select Schemes:</p> {props.schemes} </div> ); }; export default SchemesSelector;
package.json配置
{ "name": "test", "version": "0.1.0", "private": true, "dependencies": { "@reduxjs/toolkit": "^1.9.2", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "@types/jest": "^27.5.2", "@types/node": "^16.18.12", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.10", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", "bootstrap": "^5.2.3", "eslint-config-google": "^0.14.0", "eslint-plugin-jsdoc": "^40.0.0", "node-sass": "^7.0.3", "react": "^18.2.0", "react-bootstrap": "^2.7.2", "react-dom": "^18.2.0", "react-redux": "^8.0.5", "react-router-dom": "^6.8.1", "react-scripts": "5.0.1", "redux": "^4.2.1", "typescript": "^4.9.5" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "plugins": [ "@typescript-eslint", "jsdoc" ], "extends": [ "react-app", "react-app/jest", "plugin:jsdoc/recommended", "eslint:recommended", "plugin:@typescript-eslint/recommended", "google" ] }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } }
问题根源与解决方法
错误本质不是子元素数量过多,而是props.schemes是Scheme对象数组,不属于React可渲染的ReactNode类型。React无法直接渲染原始对象,必须将每个数组项转换为合法的JSX元素。
修改后的组件代码:
import React from 'react'; interface Scheme { id: number, display_name: string, } export interface Props { schemes: Array<Scheme>; } const SchemesSelector = (props: Props) => { return ( <div> <p>Select Schemes:</p> {/* 将Scheme数组映射为可渲染的JSX元素 */} {props.schemes.map(scheme => ( <div key={scheme.id}>{scheme.display_name}</div> ))} </div> ); }; export default SchemesSelector;
关键修改点:
- 使用
map遍历schemes数组,将每个Scheme对象转换为<div>(或其他标签)形式的JSX元素 - 为每个动态生成的元素添加唯一
key属性(这里用scheme.id,需保证唯一性) - 转换后,数组内容变为合法的
ReactNode集合,TypeScript类型检查通过,错误消失
内容的提问来源于stack exchange,提问作者Surender Thakran
相关产品推荐
相关产品推荐

