同时具有两个属性或两个属性都不具有的Typescript接口

同时具有两个属性或两个属性都不具有的Typescript接口,typescript,interface,Typescript,Interface,我有“成对出现”的键值对。换句话说,如果我有一个键值对A:B,那么我也想要求我的对象有C:D,但它也可以没有这两个键值对。(想想看一对的message:string,另一对的minlength:number)有没有一种优雅的方法来制作一个由任意数量的这样的对组成的界面 编辑: 为了澄清,我想为允许的对象设计一个接口: { //First pair message1: string; minLength1: number; //Second pair mes

我有“成对出现”的键值对。换句话说,如果我有一个键值对
A:B
,那么我也想要求我的对象有
C:D
,但它也可以没有这两个键值对。(想想看一对的
message:string
,另一对的
minlength:number
)有没有一种优雅的方法来制作一个由任意数量的这样的对组成的界面

编辑: 为了澄清,我想为允许的对象设计一个接口:

{
    //First pair
    message1: string;
    minLength1: number;
    //Second pair
    message2: string;
    minLength2: number;
    // ...
}

{
    //First pair omitted altogether

    //Just the second pair
    message2: string;
    minLength2: number;
}
。。。但不允许使用以下对象,因为您只有一对的一半:

{
    //First pair
    message1: string;
    // minLength1: number; // Error †
    // ...
}

†错误:如果包含
message1
,则对于给定的一对属性,您还必须包含
minLength1

,您可以做出的最接近于要求两个属性或两者都不需要的近似值是具有两个属性的类型的并集和具有类型
never
的可选属性的类型的并集(这可以防止属性与非
未定义的
)的值一起出现)。我是从中得到这个想法的。在正确的情况下,这会给您一个错误,尽管错误消息可能没有特别的帮助。然后,您可以将所需的所有属性对的并集相交(只要不超过10对,因为当TypeScript简化类型时,它会分配并集的交集以形成交集的并集,这将使类型的大小成倍增大)。例如:

type AllOrNone<T> = T | {[K in keyof T]?: never};

type MyType = AllOrNone<{
    message1: string;
    minLength1: number;
}> & AllOrNone<{
    message2: string;
    minLength2: number;
}>;
太棒了,真的很感激!
type CheckAllOrNone<A, T> =
    T | (keyof A & keyof T extends never ? {} : never);

type CheckMyType<A> = CheckAllOrNone<A, {
    message1: string;
    minLength1: number;
}> & CheckAllOrNone<A, {
    message2: string;
    minLength2: number;
}>;

function checkMyType<A extends CheckMyType<A>>(arg: A) {
    return arg;
}