如果提供了财产,则需要另一个财产

时间:2017-09-15 06:56:48

标签: typescript

所以我希望创建一个接口,我将有两个可选属性,但是如果你提供一个,你必须提供另一个,例如

interface Link {
  url: string;
}

interface LinkWithImage extends Link {
  imageUrl: string;
  alt: string;
}

type EitherOne = Link | LinkWithImage 

所以我想要的是,当使用类型EitherOne时,我只有一个属性或全部三个属性,但这使得我一提供url类型始终匹配,LinkWithImage的属性变为全部可选 我希望如果你想传递图像,你总是需要传递替代文字

我知道我可以创建单独的函数来处理这种情况,但我想知道这是否有可能

1 个答案:

答案 0 :(得分:2)

您可以将mapped types与联合类型一起使用。您必须丢失接口继承(或使用Pick<T>仅选择使用LinkWithImageNever<LinkWithImage>中存在的属性

interface Link  {
    url: string;
}

interface LinkWithImage {
    imageUrl: string;
    alt: string;
}

// Mapped type
type Never<T> = {
    [P in keyof T]?: never
}

type EitherOne = Link & Never<LinkWithImage> | LinkWithImage;

// No error
let x: EitherOne = {
    url: "a"
}

// Error
let y: EitherOne = {
    url: "a",
    imageUrl: "b"
}

// No error:
let z: EitherOne = {
    url: "a",
    imageUrl: "b",
    alt: "c"
}