所以我希望创建一个接口,我将有两个可选属性,但是如果你提供一个,你必须提供另一个,例如
interface Link {
url: string;
}
interface LinkWithImage extends Link {
imageUrl: string;
alt: string;
}
type EitherOne = Link | LinkWithImage
所以我想要的是,当使用类型EitherOne
时,我只有一个属性或全部三个属性,但这使得我一提供url
类型始终匹配,LinkWithImage
的属性变为全部可选
我希望如果你想传递图像,你总是需要传递替代文字
我知道我可以创建单独的函数来处理这种情况,但我想知道这是否有可能
答案 0 :(得分:2)
您可以将mapped types与联合类型一起使用。您必须丢失接口继承(或使用Pick<T>
仅选择使用LinkWithImage
时Never<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"
}