我正在try 创建一个被包装的元素,这样我就可以用一个通过传递props 提供的Reaction上下文提供程序来包装一些东西.

编辑:从你可以看到我的try 在这里:https://stackblitz.com/edit/stackblitz-starters-lxdb6l?file=src%2FApp.tsx

我之所以把它作为一个包装组件来做,是因为将要传递的"父"组件的数量将是一个组件数组(即:一堆React上下文提供程序),所以我不能直接硬编码.

const WrappedComponent: React.JSX.ElementType = (OutterComponent: React.JSX.ElementType, InnerComponent: React.JSX.ElementType) => {
        return <OutterComponent>{InnerComponent}</OutterComponent>
    }

如果我更改为React.JSX.ElementType,打字错误就会消失:

const WrappedComponent: React.JSX.ElementType = (OutterComponent: React.JSX.ElementType, InnerComponent: React.JSX.ElementType) => {
        return <OutterComponent>{InnerComponent}</OutterComponent>
    }

但是,我仍然不能使用该组件:

return <WrappedComponent
    OutterComponent={<Tooltip title={'just testing purposes'} >{'blah'}</Tooltip>}
    InnerComponent={<Button>Button text</Button>}
/>

提供了一大堆错误:

Element type is invalid: expected a string (for build-in components) or a class/function (for composite components) but got : object

最后,我想做的是能够 Select 性地传递一个上下文到这个组件并包装"innerability".我们的目标是创建一个通用库,它将接收上下文作为prop,并使用提供程序包装自己,以便库中的所有子元素(也作为prop传递)都能够利用上下文.

推荐答案

我应该指出,你可以简单地做:

import { FC, PropsWithChildren } from 'react';

const OuterComponent: FC<PropsWithChildren> = ({ children }) => {
  return (
        <Tooltip title={'just testing purposes'}>
          {'blah'}
          <br />
          {children}
        </Tooltip>
  );
};

const InnerComponent = <Button>Button text</Button>;

return (
      <OuterComponent>InnerComponent</OuterComponent>
);

但我已经修复了下面的代码,以防您有需要此模式的原因.


修复WrappedComponent的类型定义:

import { FC, PropsWithChildren, ReactNode } from 'react';

type WrappedComponentProps = {
  OuterComponent: FC<PropsWithChildren>;
  InnerComponent: ReactNode;
};
const WrappedComponent: FC<WrappedComponentProps> = ({
  OuterComponent,
  InnerComponent,
}) => {
  return <OuterComponent>{InnerComponent}</OuterComponent>;
};

您可以这样使用它:

return (
    <WrappedComponent
      OuterComponent={({ children }) => (
        <Tooltip title={'just testing purposes'}>
          {'blah'}
          <br />
          {children}
        </Tooltip>
      )}
      InnerComponent={<Button>Button text</Button>}
    />
  );

如果您不知道,在两个JSX组件标记之间出现的任何内容都会被简单地传递给父propschildren属性.

堆叠闪光灯:https://stackblitz.com/edit/stackblitz-starters-n7j9t8?file=src%2FApp.tsx

Typescript相关问答推荐

创建一个将任意命名类型映射到其他类型的TypScript通用类型

Tailwind CSS样式不在Svelte应用程序中呈现

脉轮ui打字脚本强制执行图标按钮的咏叹调标签-如何关闭

类型脚本如何将嵌套的通用类型展开为父通用类型

如何在第一次加载组件时加载ref数组

如何推断哪个特定密钥与泛型匹配?

无法绑定ngModel.条件ngSwitchCase中的错误

TypeScrip 5.3和5.4-对`Readonly<;[...number[],字符串]>;`的测试版处理:有什么变化?

TS2339:类型{}上不存在属性消息

如何避免从引用<;字符串&>到引用<;字符串|未定义&>;的不安全赋值?

在正常函数内部调用异步函数

回调函数中的TypeScrip类型保护返回Incorect类型保护(具有其他未定义类型的返回保护类型)

如何键入派生类的实例方法,以便它调用另一个实例方法?

在打字应用程序中使用Zod和Reaction-Hook-Forms时显示中断打字时出错

如何扩展RxJS?

是否可以在类型脚本中定义条件返回类型,而不在函数体中使用类型转换?

对于VUE3,错误XX不存在于从不存在的类型上意味着什么?

确保财产存在

TS 条件类型无法识别条件参数

const nav: typechecking = useNavigation() 和 const nav = useNavigation() 之间有什么区别?