You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套React组件Props的TypeScript类型推断问题求助

解决方案:为React组件编写正确的TypeScript泛型类型注解

要让TypeScript自动推断子组件的props类型并进行校验,需要将MyComponent定义为泛型组件,通过泛型关联组件类型与对应的props类型。

正确实现代码

import { FC, ComponentPropsWithoutRef } from 'react';

// 定义泛型组件,自动关联组件与props类型
const MyComponent = <T extends FC>({ input }: { input: [T, ComponentPropsWithoutRef<T>] }) => {
  const [Component, props] = input;
  return <Component {...props} />;
};

// 测试用子组件
interface IComponentProps {
  data: number;
}

const Component: FC<IComponentProps> = ({ data }) => {
  return <span>{data}</span>;
};

// 正确用法:无类型错误
<MyComponent input={[Component, { data: 1 }]} />

// 错误用法:TypeScript会提示“类型boolean不能赋值给类型number”
<MyComponent input={[Component, { data: true }]} />

原方案问题分析

你之前的实现中,TInput使用了默认泛型IDefault,TypeScript会直接使用这个默认类型而不会自动推断传入组件的实际props类型,导致类型校验失效。改为泛型组件后,TypeScript会根据传入的input数组中第一个元素(子组件)的类型,自动通过ComponentPropsWithoutRef<T>推导对应的props类型,从而实现精准的类型校验。

简化版实现(可选)

如果不需要单独定义props接口,也可以直接在组件参数中声明泛型约束:

const MyComponent = <T extends FC>({ input }: { input: [T, ComponentPropsWithoutRef<T>] }) => {
  const [Component, props] = input;
  return <Component {...props} />;
};

内容的提问来源于stack exchange,提问作者Ernesto Stifano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:03:15