基于其他道具价值的条件类型
Conditional type based on value of other prop
在我的项目中,我有一个组件需要两个道具:
collapsible,
onToggle
我很难在 TypeScript 中为这些道具创建类型。问题是,当可折叠为 true
时,我希望 onToggle 函数为 (): void
,但如果可折叠为 false
,我希望 onToggle 未定义。
我试过这样的事情:
type Props = {
collapsible: boolean;
onToggle: collapsible ? () => void : undefined;
}
但显然它不起作用,因为在定义 onToggle 类型时未定义可折叠。如何处理?甚至可以让类型依赖于值吗?
您的折叠道具是布尔类型的,所以它要么是 false/true,
你不能做这样的事情吗,
type Props = {
collapsible: boolean;
onToggle():void | undefined;
}
或者,
type Props = {
collapsible: boolean;
onToggle?():void;
}
然后在实现时,您可以轻松检查 onToggle 是否未定义。因为如果某些东西是可选的并且没有提供那么它在 TS 中默认是未定义的。
您可以使用可区分联合(在 collapsible
上可区分):
type Props = {
common?: string
} & ({
collapsible?: false;
} | {
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 */}
</>
}
在我的项目中,我有一个组件需要两个道具:
collapsible,
onToggle
我很难在 TypeScript 中为这些道具创建类型。问题是,当可折叠为 true
时,我希望 onToggle 函数为 (): void
,但如果可折叠为 false
,我希望 onToggle 未定义。
我试过这样的事情:
type Props = {
collapsible: boolean;
onToggle: collapsible ? () => void : undefined;
}
但显然它不起作用,因为在定义 onToggle 类型时未定义可折叠。如何处理?甚至可以让类型依赖于值吗?
您的折叠道具是布尔类型的,所以它要么是 false/true,
你不能做这样的事情吗,
type Props = {
collapsible: boolean;
onToggle():void | undefined;
}
或者,
type Props = {
collapsible: boolean;
onToggle?():void;
}
然后在实现时,您可以轻松检查 onToggle 是否未定义。因为如果某些东西是可选的并且没有提供那么它在 TS 中默认是未定义的。
您可以使用可区分联合(在 collapsible
上可区分):
type Props = {
common?: string
} & ({
collapsible?: false;
} | {
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 */}
</>
}