3

我正在尝试Box在一个新项目上制作一个通用的反应组件。这将是所有其他组件的基础。我使用 styled-system、emotion 和最终的 theme-ui 来处理我所有组件的主题和样式。

我的根Box组件如下所示:

import styled from '@emotion/styled';
import {
  compose,
  space,
  layout,
  flexbox,
  border,
  position,
  color,
  SpaceProps,
  ColorProps,
  LayoutProps,
  FlexboxProps,
  BorderProps,
  PositionProps,
} from 'styled-system';

export type BoxProps = SpaceProps &
  ColorProps &
  LayoutProps &
  FlexboxProps &
  BorderProps &
  PositionProps;

export const Box = styled.div<BoxProps>(
  {
    boxSizing: 'border-box',
    minWidth: 0,
  },
  compose(space, color, layout, flexbox, border, position)
);

我正在使用样式函数以及样式系统中的相关类型来创建一个接受空间、颜色、布局、弹性框、边框和位置道具的 Box 组件。

我得到的错误只发生在color道具上。一旦我删除它,我就不会收到任何错误。

TS错误是:

Type 'BoxProps' does not satisfy the constraint 'Pick<Pick<DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "color">, "color">'.
  Types of property 'color' are incompatible.
    Type 'string | number | symbol | (string | number | symbol | null)[] | { [x: string]: string | number | symbol | undefined; [x: number]: string | number | symbol | undefined; } | null | undefined' is not assignable to type 'string | undefined'.
      Type 'null' is not assignable to type 'string | undefined'.ts(2344)

这似乎只是从样式组件转移到情感时的一个问题,所以我不确定我是否缺少正确利用情感类型的东西?

4

1 回答 1

1

如果您对类型“type”和“as”有错误,您应该在将它们插入样式组件之前重新定义这些类型。也许,如果你尝试重写你的道具,它会有所帮助。我的例子:

/* Button component */
const Button: React.FC<ButtonProps> = ({
  isLoading,
  children,
  // should redefine this types, because React.HTMLProps<HTMLButtonElement> has incompatible similar types
  type = 'button',
  as = undefined,
  ...props
}: ButtonProps, ...others) => {
  return (
    <StyledButton {...props} {...others}>
      {isLoading ? 'Loading...' : children}
    </StyledButton>
  );
};

export default Button;
于 2021-01-02T20:49:59.030 回答