我有以下界面:
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
,该事实表示以下事实:{且仅当提供了values
或{时,onSubmit
和form
都是必需的{1}}。
答案 0 :(得分:1)
您可以使用conditional types进行此操作。我们检查泛型的值,并根据form
是否定义为true
返回不同的类型。
type FormPropsUnion<Values extends { form?: boolean }> =
Values extends { form: true }
? MyFormProps<Values>
: Partial<MyFormProps<Values>>
当form
为true
时,需要values
和onSumbit
,而当form
为false
或undefined
时,这些字段是可选的。
请注意,打字稿正在检查form
的 type ,而不是form
的 value ,因此务必使用适当的字体要返回精炼类型的任何函数中的泛型。 FormPropsUnion<MyDialogProps>
的类型将具有可选属性,因为我们不知道form
始终为真。
但是,如果我们要处理MyDialogProps
的特定实例,则可以根据P extends MyDialogProps
的值使用泛型form
获取正确的类型。
declare function makeProps<P extends MyDialogProps>(props: P): FormPropsUnion<P>;
const one = makeProps({title: "", form: true}); // required fields
const two = makeProps({title: ""}); // optional fields