如果存在另一个道具,则完全包含Typescript接口道具

时间:2020-11-04 11:03:47

标签: typescript typescript-typings

我有以下界面:

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或{时,onSubmitform都是必需的{1}}。

1 个答案:

答案 0 :(得分:1)

您可以使用conditional types进行此操作。我们检查泛型的值,并根据form是否定义为true返回不同的类型。

type FormPropsUnion<Values extends { form?: boolean }> =
    Values extends { form: true }
    ? MyFormProps<Values>
    : Partial<MyFormProps<Values>>

formtrue时,需要valuesonSumbit,而当formfalseundefined时,这些字段是可选的。

请注意,打字稿正在检查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

Typescript Playground Link