【问题标题】:How to create one generic function from two similiar?如何从两个相似的函数中创建一个通用函数?
【发布时间】:2020-07-30 07:39:04
【问题描述】:

我有两个相同的功能,但在不同的实体上工作,

    async getUserName(userId: number): Promise<string> {
        const user = await this.conn.getRepository(User).findOne(userId);
        return user .name;
    }

    async getOrderName(orderId: number): Promise<string> {
        const order = await this.conn.getRepository(Order).findOne(orderId);
        return order .name;
    }

如何在这两个函数的位置创建一个通用函数,它只接受实体和id 数字,并像上述函数中的指南一样返回给定名称?

ps。我正在使用 typescript 和 typeorm

感谢您的帮助

【问题讨论】:

    标签: javascript typescript oop generics typeorm


    【解决方案1】:

    您很可能会将两个函数之间的差异转化为所述函数的参数

    type TRepository = User | Order
    async getName(id: number, rep: TRepository): Promise<string> {
        const entity = await this.conn.getRepository(rep).findOne(id);
        return entity.name;
    }
    

    【讨论】:

    • 我可以把type TRepository = User | Order放在哪里?进入constructor?
    【解决方案2】:

    您可以发送整个对象,而不是发送 id,基于此您可以找到要搜索的存储库并从中获取 id。

    此外,由于您使用的是 await,因此您的函数将返回一个字符串而不是一个 Promise。

    async getOrderName(searchObj: User|Order): string {
      const field = searchObj.instanceOf(User) ? User : Order
      const value = await this.conn.getRepository(field).findOne(searchObj.id);
      return value.name;
    }
    

    或者,你也可以试试Object.constructor

    async getOrderName(searchObj: User|Order): string {
      const value = await this.conn
        .getRepository(searchObj.constructor)
        .findOne(searchObj.id);
      return value.name;
    }
    

    【讨论】:

    • 从这两个函数中给我Property 'name' does not exist on type 'unknown'.
    • 试试const value: User|Order|null = await this.conn...; return !!value ? value.name : undefined
    • 还是这个问题
    • 问题:您正在尝试哪种方法?您是否在value 中获得输出?
    • 我尝试从value by value.name 只获取name
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多