【问题标题】:How to use the interface of typescript with the or condition如何使用带有 or 条件的 typescript 接口
【发布时间】:2020-05-12 02:09:15
【问题描述】:

我是打字稿的新手。在这里,我有以下代码,如下所示,

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
    );
  });
}

现在,我无法做到bsp?.Original?.active ?? undefined : bsp?.Original?.Original?.active ?? undefined。因为我只能为一个界面做到这一点,所以任何人都可以帮助我解决这个问题。喜欢,

如何将这两个接口用于同一个类函数。

谢谢。

【问题讨论】:

  • 你想在接口还是在实现中使用OR条件?
  • 在实现中,在产品中:Array 这个地方。
  • 您可以使用? 指定可选属性或参数。

标签: javascript angular reactjs typescript


【解决方案1】:

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

例如:

memoize((products?: Array<Product | MainProduct>, ismain?:number) {
}

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

另一种方法是使用[Partial][1]。 Partial 将返回给定接口的所有子集。

memoize((products?: Array<Partial<Product | MainProduct>>, ismain?:number) {
}

【讨论】:

  • 是的,但是当我尝试做 products?.Original?.Original 时,我不能这样做,因为它仍然将 Product 作为接口而不是 MainProduct 。所以,我希望你能坚持我的观点,
  • 如何在 const group = _.groupBy(products, (bsp: Product) => 这一行使用,因为它有 Product 或 MainProduct。
  • @GaneshKaspate 你不需要在这里为bsp 指定类型。它应该通过泛型通过 _.groupBy 。如果没有,那么您可以使用联合运算符将两个接口都用作bsp: Product | MainProduct
  • 是的,但是如果我使用联合,那么它会给我在两个接口中通用的,而不是在两个地方
  • 这里的问题是,使用 Array 它实际上需要这两个接口的联合,而不是全部。我正在尝试从该接口获取整个关键值。因此,当我取值时,我只能获得 Id,因为 Id 在两个接口中都很常见。希望你有我的问题
【解决方案2】:

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

import { groupBy, memoize } from "lodash";
import { MainOrNot } from "./tril";

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

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

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

class FirstOriginalImp implements FirstOriginal {
    active: boolean;
    status: boolean;
    public constructor(data: FirstOriginal) {
        Object.assign(this, data);
    }
}

class ProductImp implements Product {
    id: number;
    name: string;
    Original: FirstOriginal;

    public constructor(data: Product) {
        Object.assign(this, data);
    }
}

class MainProductImp implements MainProduct {
    id: number;
    Name: string;
    Original: Product;

    public constructor(data: MainProduct) {
        Object.assign(this, data);
    }
}

export type MainOrNot = MainProductImp | ProductImp;

class MainService {
    buildproduct = memoize((products: Array<MainOrNot>, ismain: boolean) => {
        const group = groupBy<MainOrNot>(products, (bsp) => {
            if (bsp instanceof MainProductImp) {
                return bsp?.Original?.Original?.active ?? undefined;
            }

            if (bsp instanceof ProductImp) {
                return bsp?.Original?.active ?? undefined;
            }
        });
    });
}

【讨论】:

猜你喜欢
  • 2020-12-28
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
相关资源
最近更新 更多