reactjs React Typescript布尔属性类型为可选,默认值设置为“false”

fdx2calv  于 2023-01-12  发布在  React
关注(0)|答案(2)|浏览(235)

我加入了一个大型项目的大型开发团队,在他们的指导方针中,强制性地将每个布尔属性作为可选属性输入,然后默认它们为错误;原因是:***“良好实践”***。但是,没有人能够给予我一个很好的解释,编写指南时在场的人已经不在团队中了。
下面是一个小例子:

type ButtonProps = {
    isChecked?: boolean
}

const Button: FC<ButtonProps> = ({isChecked = false}) => {
   ...

有没有人遇到过类似的实践,或者知道用这种方式编写布尔值的好理由?

idfiyjo8

idfiyjo81#

这与jsx语法的布尔快捷方式有关:

type ButtonOptionnalProps = {
        isChecked?: boolean
    };
    
    export const ButtonWithDefaultWithOptionnal: React.FC<ButtonOptionnalProps> = ({ isChecked = false }) => (
        <button className={isChecked ?
            "checked" :
            "unchecked"} />
    );
    
    export const ATestComponent1: React.FC<{}> = ({}) => (<>
        <ButtonWithDefaultWithOptionnal isChecked={false} />
        <ButtonWithDefaultWithOptionnal isChecked={true} />
        <ButtonWithDefaultWithOptionnal isChecked />
        <ButtonWithDefaultWithOptionnal />
    </>);

这样,每个语法都是有效的,并且isChecked在控件中具有布尔类型。
另一方面,你有:

type ButtonProps = {
        isChecked: boolean
    };
    
    export const ButtonWithoutDefaultWithoutOptionnal: React.FC<ButtonProps> = ({ isChecked }) => (
        <button className={isChecked ?
            "checked" :
            "unchecked"} />
    );
    
    export const ATestComponent2: React.FC<{}> = ({}) => (<>
        <ButtonWithoutDefaultWithoutOptionnal isChecked={false} />
        <ButtonWithoutDefaultWithoutOptionnal isChecked={true} />
        <ButtonWithoutDefaultWithoutOptionnal isChecked />
        <ButtonWithoutDefaultWithoutOptionnal />
    </>);

这样最后一个语法就错了。
最后一条路:

type ButtonOptionnalProps = {
        isChecked?: boolean
    };
    
    export const ButtonWithoutDefaultWithOptionnal: React.FC<ButtonOptionnalProps> = ({ isChecked }) => (
        <button className={isChecked ?
            "checked" :
            "unchecked"} />
    );
    
    export const ATestComponent3: React.FC<{}> = ({}) => (<>
        <ButtonWithoutDefaultWithOptionnal isChecked={false} />
        <ButtonWithoutDefaultWithOptionnal isChecked={true} />
        <ButtonWithoutDefaultWithOptionnal isChecked />
        <ButtonWithoutDefaultWithOptionnal />
    </>);

这种方法语法很好,但isChecked是布尔值|未定义,它可能导致isChecked === false等条件下的细微错误。

ejk8hzay

ejk8hzay2#

这是一个很好的实践,因为你可以更容易地调用组件,包括isChecked或不作为prop,因为prop是一个布尔值,或者如果有状态,你可以用状态来控制它。

const [open, setOpen] = useState<boolean>(false); 

// it is not checked (in a simple way)
<Button />

// it is checked (again in a simple way)
<Button isChecked />

// you can use a state variable, which is a boolean
<Button isChecked={open} />

这就是为什么该做法可被视为更好的做法

相关问题