【问题标题】:React + Material-UI + Typescript: Inherit props from button to add different variantsReact + Material-UI + Typescript:从按钮继承道具以添加不同的变体
【发布时间】:2019-11-03 20:48:20
【问题描述】:

我想扩展默认的 Material-UI 按钮以添加更多变体,例如“方形”。

如何定义prop接口来继承/组合props。

这是我的代码:

import React from "react";
import { Button as MuiButton } from "@material-ui/core";
import { ButtonProps as MuiButtonProps } from "@material-ui/core/Button";

interface ButtonProps extends MuiButtonProps {
  variant?: "square";
}

const defaultProps = {};

const Button: React.FC<ButtonProps> = ({variant, children, ...props}) => {
  return (
    <MuiButton variant={variant} {...props}>
       {props.children}
    </MuiButton>;
  )
};

Button.defaultProps = defaultProps;

export default Button;

理想情况下,我想像这样使用这个组件:

<ExtendedButton href="/" variant="square">Click Me!</ExtendedButton>

【问题讨论】:

    标签: reactjs typescript material-ui


    【解决方案1】:

    TYpeScript 不允许在扩展接口时覆盖属性。所以你应该首先从MuiButtonProps中排除属性,然后在ButtonProps中重新定义它。

    import React from "react";
    import { Button as MuiButton } from "@material-ui/core";
    import { ButtonProps as MuiButtonProps } from "@material-ui/core/Button";
    
    interface ButtonProps extends Pick<MuiButtonProps, Exclude<keyof MuiButtonProps, "variant">> {  
        variant?: "square" | MuiButtonProps["variant"];
    }
    

    PickExclude 的属性排除适用于 TypeScript 3.5 及以下至 2.8。您可能会看到 another options 根据您使用的 TypeScript 版本排除属性。

    如果您希望扩展现有属性variant 的当前类型,您可以使用索引访问运算符获取原始variant 属性的类型,以将其与其他"square" 类型联合。

    【讨论】:

    • 这样不行,MuiButtonProps中定义的variant属性定义为:variant?: "text" | “概述” | “包含”。我想扩展这些道具并添加“square”作为我的新组件的选项。
    • 我已经修改了答案。请看一下
    • 当你将传入的可能包含 variant: "square" 的 prop 传递给 MuiButton 时,它会抛出错误,对吧?因为它不知道“正方形”。如何过滤属性以将类型定义与您正在扩展的 Mui 组件实现相匹配?
    猜你喜欢
    • 2022-08-20
    • 2020-03-13
    • 2021-05-22
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2021-03-14
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多