我有以下接口:
interface MyDialogProps extends DialogProps {
title: string;
subtitle?: string;
action?: React.ReactNode;
form?: boolean;
}
interface MyFormProps <Values extends object> {
values: Values;
onSubmit: (values: Values) => Promise <{}> ;
}
我需要这两个接口之间的并集/交集type
,它表示当且仅当提供form
或true
时需要values
和onSubmit
。
您可以使用条件类型来完成此操作。我们检查泛型的值,并根据form
是否定义为true
返回不同的类型。
type FormPropsUnion<Values extends { form?: boolean }> =
Values extends { form: true }
? MyFormProps<Values>
: Partial<MyFormProps<Values>>
当form
是true
时,需要values
和onSumbit
,当form
是false
或undefined
时,这些字段是可选的。
请注意,typescript检查的是form
的类型,而不是form
的值,因此在任何想要返回精化类型的函数中使用适当的泛型是很重要的。FormPropsUnion<MyDialogProps>
的类型将具有可选属性,因为我们不知道form
将始终为true。
但是,如果我们处理的是MyDialogProps
的一个特定实例,那么我们就可以根据form
的值使用泛型P extends MyDialogProps
来获得正确的类型。
declare function makeProps<P extends MyDialogProps>(props: P): FormPropsUnion<P>;
const one = makeProps({title: "", form: true}); // required fields
const two = makeProps({title: ""}); // optional fields
打字游戏场链接