Mongodb 当类型=A | B时,它将启用两者的组合。这能预防吗?

Mongodb 当类型=A | B时,它将启用两者的组合。这能预防吗?,mongodb,typescript,Mongodb,Typescript,我想在typescript中说,mongodb中的查找可以通过键匹配,也可以通过管道: type Lookup<T> = { $lookup: | { from: keyof typeof Collections; localField: string; foreignField: string; as: string; } | { from: keyof typeof C

我想在typescript中说,mongodb中的查找可以通过键匹配,也可以通过管道:

type Lookup<T> = {
  $lookup:
    | {
        from: keyof typeof Collections;
        localField: string;
        foreignField: string;
        as: string;
      }
    | {
        from: keyof typeof Collections;
        let: { [k: string]: string };
        pipeline: Aggregation<T>[];
        as: string;
      };
};
类型查找={
$lookup:
| {
from:集合类型的键;
localField:string;
外域:字符串;
as:字符串;
}
| {
from:集合类型的键;
let:{[k:string]:string};
管道:聚合[];
as:字符串;
};
};
但结果是两者的结合。 当我已经有
localField
时,我不希望typescript向我显示
管道
let
选项

我怎样才能做到这一点


谢谢

为了明确区分工会成员,我们需要适当的帮助。这意味着我们需要附加一个鉴别器,它将清楚地将一个成员与另一个成员区分开来。考虑到属性定义为“代码>标签TA/代码>这样的小更改:

type Lookup<T> = {
  $lookup:
    | {
        tag: 'A',
        from: keyof typeof Collections;
        localField: string;
        foreignField: string;
        as: string;
      }
    | {
        tag: 'B',
        from: keyof typeof Collections;
        let: { [k: string]: string };
        pipeline: Aggregation<T>[];
        as: string;
      };
};
类型查找={
$lookup:
| {
标签:“A”,
from:集合类型的键;
localField:string;
外域:字符串;
as:字符串;
}
| {
标签:“B”,
from:集合类型的键;
let:{[k:string]:string};
管道:聚合[];
as:字符串;
};
};
由于使用了判别式
标记
,因此无法传递具有混合值的对象


歧视性结合是解决问题的正确方式,但我们也可以在类型层面上施展一些魔力。考虑:

//简化类型
A型={
a:弦,
b:弦;
c:字符串;
}
B类={
a:弦,
d:弦,
e:字符串
}
//我还制作了单机版
X型=A | B型
//键入将执行此任务的类型
类型独占={
[K in keyof T]:K扩展A?T的keyof[K]:从不
} | {
[K in keyof T]:K扩展了B?T的keyof[K]:从不
}
//只允许非混合值的函数
函数测试(x:Exclusive){return x}
试验({
a:‘a’,
b:‘b’,
d:‘d’,
e:‘e’

})//错误,因为这是一个混音,谢谢!知道这一点很好,但不幸的是,我必须保持正确的语法,不能添加这样一个键。另一个解决方案是使用类型系统dark places。考虑阅读这个