Javascript 如何使用带有or条件的typescript接口

Javascript 如何使用带有or条件的typescript接口,javascript,angular,reactjs,typescript,Javascript,Angular,Reactjs,Typescript,我不熟悉打字稿。这里,我有下面的代码,看起来像 interface FirstOriginal { active: boolean; status: boolean; } interface Product { id: number; name: string; Original: FirstOriginal; } interface MainProduct { id: number; Name: string; Original: Product; } c

我不熟悉打字稿。这里,我有下面的代码,看起来像

interface FirstOriginal {
  active: boolean;
  status: boolean;
}

interface Product {
  id: number;
  name: string;
  Original: FirstOriginal;
}

interface MainProduct {
  id: number;
  Name: string;
  Original: Product;
}

class MainService {
  buildproduct = memoize((products: Array<Product | MainProduct>, ismain) => {
    const group = _.groupBy(products, (bsp: Product) =>
      !ismain
        ? bsp?.Original?.active ?? undefined
        : bsp?.Original?.Original?.active ?? undefined
    );
  });
}
interface-FirstOriginal{
活动:布尔值;
状态:布尔型;
}
接口产品{
id:编号;
名称:字符串;
原件:第一份原件;
}
接口主产品{
id:编号;
名称:字符串;
原件:产品;
}
类主服务{
buildproduct=memoize((产品:Array,ismain)=>{
const group=uu.groupBy(产品,(bsp:Product)=>
!伊斯曼
?bsp?原始?激活?未定义
:bsp?.Original?.Original?.active?未定义
);
});
}
现在,我无法执行
bsp?.Original?.active??未定义:bsp?原始?原始?活动??未定义
。因为我只能为一个界面做这件事,所以,有人能帮我做这件事吗。像

如何为同一类函数使用这两个接口


谢谢

要指定可选属性或参数,可以在属性/参数名称前面使用

例如:

memoize((products?: Array<Product | MainProduct>, ismain?:number) {
}
另一种方法是使用
[Partial][1]
。Partial将返回给定接口的所有子集

memoize((products?: Array<Partial<Product | MainProduct>>, ismain?:number) {
}
memoize((产品?:数组,ismain?:编号){
}

在这里!javascript上不存在接口。即使您可以在执行时解决所有编译错误,javascript也无法分辨哪个是哪个。如果我们想知道它是什么类型的blahblah,我们需要添加javascript。这就是我创建
Imp
类的原因

从“lodash”导入{groupBy,memoize};
从“/tril”导入{MainOrNot};
接口原件{
活动:布尔值;
状态:布尔型;
}
接口主产品{
id:编号;
名称:字符串;
原件:产品;
}
接口产品{
id:编号;
名称:字符串;
原件:第一份原件;
}
类FirstOriginalImp实现FirstOriginal{
活动:布尔值;
状态:布尔型;
公共构造函数(数据:原始){
分配(此,数据);
}
}
类ProductImp实现产品{
id:编号;
名称:字符串;
原件:第一份原件;
公共构造函数(数据:产品){
分配(此,数据);
}
}
类MainProductImp实现MainProduct{
id:编号;
名称:字符串;
原件:产品;
公共构造函数(数据:MainProduct){
分配(此,数据);
}
}
导出类型MainOrNot=MainProductImp | ProductImp;
类主服务{
buildproduct=memoize((产品:数组,ismain:boolean)=>{
const group=groupBy(产品,(bsp)=>{
if(MainProductImp的bsp实例){
返回bsp?原始?原始?活动?未定义;
}
if(ProductImp的bsp实例){
返回bsp?原始?活动?未定义;
}
});
});
}

您想在接口中还是在实现中使用或设置条件?在实现中,在产品中:数组此位置。您可以使用
指定可选属性或参数。是的,但当我尝试执行产品时?.Original?.Original我无法执行此操作,因为它仍然将产品作为接口,而不是主产品。因此,我希望您能理解我的观点,即如何使用at const group=u.groupBy(products)(bsp:Product)=>这一行,因为它有Product或MainProduct。@GaneshKaspate您不需要在这里为
bsp
指定类型。它应该通过泛型通过u.groupBy。如果没有,那么您可以使用union运算符将这两个接口都作为
bsp:Product | MainProduct
使用,但是如果我使用union,它会给出在两个接口,而不是在两个位置。这里的问题是,在使用数组之后,它实际上需要这两个接口的并集,而不是全部。我正在尝试从这些接口获取整个键值。因此,当我获取值时,我只能获取Id,因为Id在两个接口中都很常见。希望你得到我的问题你能检查一下吗
memoize((products?: Array<Partial<Product | MainProduct>>, ismain?:number) {
}