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

TypeScript React中如何实现编译时条件类型检查?

问题2:React组件根据子元素类型决定是否包裹标签?

针对React组件的需求,结合TypeScript的泛型和条件类型,可以在编译时区分字符串子元素,同时保留运行时检查处理动态场景,以下是两种实现方案:

方案1:泛型组件自动推导

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

// 泛型Props,约束子元素为ReactNode
type FunProps<T extends React.ReactNode> = {
  children: T;
};

const Fun = <T extends React.ReactNode>({ children }: FunProps<T>) => {
  // 编译时根据T的类型推断分支逻辑
  if (typeof children === "string") {
    return <p style={{ backgroundColor: "yellow" }}>{children}</p>;
  }
  return <>{children}</>;
};

render(
  <>
    <Fun>{"123"}</Fun> {/* 编译时知道会渲染带黄色背景的p标签 */}
    <Fun>{123}</Fun> {/* 编译时知道直接渲染数字 */}
  </>,
  document.getElementById("root")
);

方案2:组件重载(更严格的编译时约束)

通过组件重载,明确区分字符串和非字符串子元素的处理逻辑,编译时就能精准识别:

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

// 重载1:处理字符串子元素
function Fun({ children }: { children: string }): JSX.Element;
// 重载2:处理非字符串子元素
function Fun({ children }: { children: Exclude<React.ReactNode, string> }): JSX.Element;

// 组件实现
function Fun({ children }: { children: React.ReactNode }) {
  if (typeof children === "string") {
    return <p style={{ backgroundColor: "yellow" }}>{children}</p>;
  }
  return <>{children}</>;
}

render(
  <>
    <Fun>{"123"}</Fun>
    <Fun>{123}</Fun>
  </>,
  document.getElementById("root")
);

内容的提问来源于stack exchange,提问作者Page not found

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:45:33