我正在将React组件从JavaScript转换为TypeScript.该组件包括对React.cloneElement的调用,传递通过组件props 接收的值.所讨论的值将是不同的react 组分,在下面的示例中称为Dep.Dep是一个基于类的组件,这就是它同时作为类型和值工作的原因).我得到了一个类型错误,我不知道如何解决.

下面是一个简化的示例,其中只包含演示错误所需的内容:

import React from "react";
import Dep from "./Dep";

export interface ExampleProps {
  dep: Dep;
}

export const Example = (props: ExampleProps) => {
  let dep = React.cloneElement(props.dep);
                            // ^~~~~~~~~ TS error here
  return (
    <div>
      {dep}
    </div>
  );
};

以及编译器的错误:

src/components/Example.tsx:9:32 - error TS2769: No overload matches this call.
  The last overload gave the following error.
    Argument of type 'Dep' is not assignable to parameter of type 'ReactElement<unknown, string | JSXElementConstructor<any>>'.
      Type 'Dep' is missing the following properties from type 'ReactElement<unknown, string | JSXElementConstructor<any>>': type, key

9   let dep = React.cloneElement(props.dep);
                                 ~~~~~~~~~

  node_modules/@types/react/index.d.ts:331:14
    331     function cloneElement<P>(
                     ~~~~~~~~~~~~
    The last overload is declared here.


Found 1 error.

我知道cloneElement期望它的第一个参数是ReactElement.我不清楚这种类型代表什么,为什么Dep不兼容.以下是ReactElement的定义,供参考:

interface ReactElement<P = any, T extends string | JSXElementConstructor<any> = string | JSXElementConstructor<any>> {
    type: T;
    props: P;
    key: Key | null;
}

错误消息说,它不兼容的原因是缺少typekey属性,但不清楚它为什么希望有这样的属性,以及我如何用这个形状表示我的组件.

推荐答案

我看到cloneElement希望它的第一个参数是ReactElement.我不清楚这种类型代表什么以及为什么Dep不兼容.

元素通常由JSX语法生成.例如,<div /><Router /><Dep />都是元素的示例.请注意,Dep不是一个元素,而是一个组件.带JSX尖括号的<Dep />是一个元素.也可以通过手动调用React.createElement来创建元素,尽管这并不常见.

所以,如果你打算用这样的例子:

<Example dep={<Dep />} />

然后,您将希望将类型设置为:

export interface ExampleProps {
  dep: React.ReactElement;
}

请注意,这将允许任何元素,而不仅仅是引用Dep组件的元素.

Typescript相关问答推荐

React组件数组及其props 的类型定义

您可以创建一个类型来表示打字员吗

TypScript ' NoInfer '类型未按预期工作

如何使用axios在前端显示错误体

如何防止TypeScript允许重新分配NTFS?

TypeScript实用程序类型—至少需要一个属性的接口,某些指定属性除外

如何在函数参数中使用(或模仿)`success`的行为?

如何用不同的键值初始化角react 形式

如何将联合文字类型限制为文字类型之一

ANGLE找不到辅助‘路由出口’的路由路径

如何在LucideAngular 添加自定义图标以及如何使用它们

React Typescript项目问题有Redux-Toolkit userSlice角色问题

一个打字类型可以实现一个接口吗?

为什么&;(交集)运算符会删除不相交的属性?

如何在方法中正确地传递来自TypeScrip对象的字段子集?

Typescript 中相同类型的不同结果

将布尔值附加到每个对象特性

使用RXJS获取数据的3种不同REST API

仅当类型为联合类型时映射属性类型

递归地排除/省略两种类型之间的公共属性