如何从两个类似的对象创建一个泛型函数?

时间:2020-07-30 07:39:04

标签: javascript typescript oop generics typeorm

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

    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。我正在使用打字稿和打字稿

感谢您的帮助

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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

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

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;
}
相关问题