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

TypeScript编译错误TS2339:如何处理string|ReactElement的props访问问题

TypeScript编译错误解决方案:访问联合类型属性报错

问题场景

编译时出现以下错误:

src/components/NTableBody/index.tsx:110:68 - error TS2339: Property 'props' does not exist on type 'string | ReactElement<any, string | JSXElementConstructor<any>>'.
  Property 'props' does not exist on type 'string'.

相关代码及类型定义:
组件逻辑代码:

(currentCellData.ellipsis && currentCellData.renderValue.props.children ? (
        <NTooltip key={index} title={currentCellData.renderValue} arrow placement="top-start">
          {renderTableCell}
        </NTooltip>
      ) : (
        <Fragment key={index}>{renderTableCell}</Fragment>
      ))

类型定义:

declare type TValue = {
    renderValue: string | React.ReactElement;
    onClick?: (e: React.MouseEvent<HTMLTableCellElement>) => void;
    ellipsis?: boolean;
};

问题核心:renderValue是string | React.ReactElement联合类型,直接访问props时TypeScript会提示string类型无该属性,且不能修改这个类型定义(其他组件依赖)。


解决方法

1. 使用typeof类型守卫区分类型

通过typeof判断renderValue是否为string,只在它是ReactElement时访问props:

(currentCellData.ellipsis && 
 typeof currentCellData.renderValue !== 'string' && 
 currentCellData.renderValue.props.children ? (
        <NTooltip key={index} title={currentCellData.renderValue} arrow placement="top-start">
          {renderTableCell}
        </NTooltip>
      ) : (
        <Fragment key={index}>{renderTableCell}</Fragment>
      ))

TypeScript会在typeof ... !== 'string'的分支里自动将renderValue推断为React.ReactElement,允许安全访问props。

2. 使用类型断言强制指定类型

如果业务逻辑能确保当前场景下renderValue一定是ReactElement(比如ellipsis为true时仅传入元素),可以用类型断言跳过类型检查:

(currentCellData.ellipsis && 
 (currentCellData.renderValue as React.ReactElement).props.children ? (
        <NTooltip key={index} title={currentCellData.renderValue} arrow placement="top-start">
          {renderTableCell}
        </NTooltip>
      ) : (
        <Fragment key={index}>{renderTableCell}</Fragment>
      ))

注意:这种方法需确保业务逻辑的准确性,否则可能引发运行时错误。

3. 结合可选链优化判断

如果props.children可能不存在,可加上可选链避免运行时错误,同时配合类型守卫:

(currentCellData.ellipsis && 
 typeof currentCellData.renderValue !== 'string' && 
 currentCellData.renderValue.props?.children ? (
        <NTooltip key={index} title={currentCellData.renderValue} arrow placement="top-start">
          {renderTableCell}
        </NTooltip>
      ) : (
        <Fragment key={index}>{renderTableCell}</Fragment>
      ))

可选链?.会在props为undefined时直接返回undefined,避免报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:33:27