Material-UI 组件的 styled-components 打字稿错误

Posted

技术标签:

【中文标题】Material-UI 组件的 styled-components 打字稿错误【英文标题】:styled-components typescript error with Material-UI component 【发布时间】:2019-06-27 19:44:08 【问题描述】:

使用 typescript 并希望使用 styled-components 为 Material UI 组件设置样式。 但是 StyledComponent 出现类型错误,显示 Type ' children: string; ' is missing the following properties

import React,  PureComponent  from 'react';
import styled from 'styled-components'; // ^4.1.3
import  Button  from '@material-ui/core'; // ^3.9.1

class TestForm extends PureComponent 
  render() 
    return (
      <>
        <Button style= backgroundColor: 'red' >Work</Button>/* OK  */

        <StyledButton>Doesn't work</StyledButton>/* Type Error happens here <=============== */
        /**
          Type ' children: string; ' is missing the following properties from type 'Pick<Pick<(ButtonProps & RefAttributes<Component<ButtonProps, any, any>>) | (ButtonProps &  children?: ReactNode; ), "form" | "style" | "title" | "disabled" | "mini" | ... 279 more ... | "variant"> & Partial<...>, "form" | ... 283 more ... | "variant">': style, classes, className, innerRef [2739]
         */
      </>
    );
  


const StyledButton = styled(Button)`
  background: blue;
`;

export default TestForm;

显示儿童道具丢失。 我也尝试了以下方法,但仍然无法正常工作。

const StyledButton = styled(Button)< children: string; >`
  background: blue;
`;

有人知道如何在 typescript 中使用 Material UI 和 styled-components 吗?

【问题讨论】:

【参考方案1】:

material-ui v3.9.3styled-components v4.2.0 也出现此错误,这是发布此答案时的最新版本。

我的解决方法如下

import styled from 'styled-components'
import Button,  ButtonProps  from '@material-ui/core/Button'

const StyledButton = styled(Button)`
  background: blue;
` as React.ComponentType<ButtonProps>

这会将 StyledButton 转换为与 Material UI Button 相同的类型。它消除了错误并为您提供与 Button 相同的类型检查。在大多数情况下,这就是你想要的。

如果您需要在样式中使用其他道具,并希望强制它们被传递,您可以扩展 ButtonProps 并强制转换为该自定义类型:

type StyledButtonProps = ButtonProps &  background: string 

const StyledButton = styled(Button)`
  background: $(props: StyledButtonProps) => props.background;
` as React.ComponentType<StyledButtonProps>


const MyComponent = () => (
  <div>
    <StyledButton size='small' background='blue'>one</StyledButton>

    // ERROR HERE - forgot the 'background' prop
    <StyledButton size='small'>two</StyledButton>
  </div>
)

【讨论】:

作者评论了以下解决方法,并说它应该在即将发布的版本 4 中解决:github.com/mui-org/material-ui/issues/…【参考方案2】:

几个月前它运行良好,但我刚刚开始了一个新项目并且遇到了同样的问题。一定是较新的版本有问题。

很糟糕,我知道,但与此同时,最好的办法是:

const StyledButton: any = styled(Button)`
  background: blue;
`;

【讨论】:

以上是关于Material-UI 组件的 styled-components 打字稿错误的主要内容,如果未能解决你的问题,请参考以下文章

抽屉组件后面的material-ui覆盖div

Material-ui 与其他非 mui 反应组件的兼容性

如何在 Material-UI 中使用 Box 组件覆盖按钮?

React & Material-UI 分页 - 将 Material-UI 的组件连接到 React-Router

Material-UI 主题化组件库

如何使用 Typescript 扩展 Material-UI 组件的道具?