reactjs - 基于其他 Prop 值(value)的条件类型

标签 reactjs typescript toggle react-props react-typescript

在我的项目中,我有一个组件需要两个 Prop :

collapsible,
onToggle

我很难在 TypeScript 中为这些 Prop 创建类型。问题是当 collapsible 为 true 我希望 onToggle 函数为 (): void 但如果 collapsible 为 false 我想要onToggle 未定义。

我试过这样的:

type Props = {
  collapsible: boolean;
  onToggle: collapsible ? () => void : undefined;
}

但显然它不起作用,因为在定义 onToggle 类型时 collapsible 是未定义的。如何处理?甚至可以让类型依赖于值吗?

最佳答案

您可以使用可区分的联合(在 collapsible 上可区分):

type Props = {
    common?: string
} & ({
    collapsible?: false;
    onToggle?: never;
} | {
    collapsible: true;
    onToggle: () => void
    })

function Test(p: Props) {
    return <></>
}

function Usage() {
    return <>
        <Test /> {/* Ok */}
        <Test collapsible={false} /> {/* Ok */}
        <Test collapsible={true} /> {/* Err, as expected */}
        <Test collapsible={true} onToggle={() => { }} /> {/* ok */}
    </>
}

Playground Link

关于reactjs - 基于其他 Prop 值(value)的条件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62279757/

相关文章:

javascript - 在react-image-gallery中设置标题样式

css - Bootstrap Toggle 显示在中等尺寸的屏幕上

javascript - 如何在渲染方法执行之前通过 Promise 为状态赋值

TypeScript Object.assign 混淆

javascript - 如何在 Angular 中获取所选选项的索引

angular - PathLocationStrategy 仅在本地有效

jQuery:如何在悬停时切换显示

javascript - 想要显示前三个 div,然后让剩余部分切换

javascript - Bootstrap Grid 无法与 ReactJS 一起使用(create-react-app)

javascript - 无法将样式应用于具有样式组件的第一个子项