如何捕获另一个类型参数的子属性的类型?

时间:2019-01-24 01:58:55

标签: reactjs typescript

如何捕获另一个类型参数的子属性的类型?

实际问题有点含糊,因此我认为提供我实际问题的背景是值得的,但是实际问题纯粹是打字稿问题。

上下文

我正在编写一个将render prop components转换为higher order components的函数。

所以,如果我有一个像这样的渲染道具组件:

function RenderPropComponent({ children, propToRenderPropComponent }) {
  const propFromRenderPropComponent = /* ... */;
  return children({ propFromRenderPropComponent });
}

我正在编写的函数将像这样转换RenderPropComponent

import convertToHoc from 'helpers/convertToHoc';
import RenderPropComponent from './RenderPropComponent';

const withRenderProp = convertToHoc(RenderPropComponent);

function RequiresPropFromRenderPropComponent({ propFromRenderPropComponent }) {
  return <>{propFromRenderPropComponent}</>;
}

export default withRenderProp({
  propToRenderPropComponent: 'a'
})(RequiresPropFromRenderPropComponent);

所以现在我要输入convertToHoc

这是实现:

import React from 'react';

export default function convertToHoc(RenderPropComponent) {
  return hocParams => Component =>
    React.forwardRef((props, ref) => (
      <RenderPropComponent
        {...hocParams}
        children={renderProps => <Component {...renderProps} {...props} ref={ref} />}
      />
    ));
}

这是我的内容:

import React from 'react';
import { RemoveProps } from 'helpers/typings';

type RenderPropComponent<
  Props extends {
    children: (childProps: ChildProps) => any
   },
  ChildProps
> = React.ComponentType<Props>;

export default function convertToHoc<RenderProps, ChildProps>(
  RenderPropComponent: RenderPropComponent<RenderProps, ChildProps>,
): (
  params: RemoveProps<RenderProps, 'children'>,
) => <P>(Component: React.ComponentType<P>) => React.ComponentType<P & ChildProps>;

问题

这些类型的打字工作很正常,但是总是为ChildProps分配{}类型,而不是正确的子道具。

您知道为什么这种类型总是将ChildProps推论为{}吗?

0 个答案:

没有答案