Как я могу утверждать, что универсальный тип T имеет определенное свойство - PullRequest
0 голосов
/ 20 сентября 2019

Я создаю абстрактный класс BaseRepository, который расширяет Repository.T передается в этот абстрактный класс.Метод main принимает частичное значение T, но id должен быть опциональной опорой T. Как я могу утверждать, что T имеет опциональную опору id?

export abstract class BaseRepository<T> extends Repository<T> {
  async main (changes: DeepPartial<T & { id?: number }>) {
    const p = this.create()
    Object.assign(p, changes)
    if (p && p.id) await this.update(p.id, p )
    const v = await this.save(p)
    return this.findOneOrFail({ where: v })
  }
}

1 Ответ

0 голосов
/ 20 сентября 2019

Утверждение, что универсальный тип имеет необязательное свойство, довольно просто.Просто определите интерфейс, который имеет свойство, и скажите, что тип расширяет этот интерфейс.Это будет выглядеть примерно так:

interface Identifiable {
  id: number;
}

export abstract class BaseRepository<T extends Identifiable> extends Repository<T> {
  async main (changes: DeepPartial<T>) {
    const p = this.create();
    Object.assign(p, changes);

    if (p && p.id) {
      await this.update(p.id, p);
    }

    const v = await this.save(p);
    return this.findOneOrFail({ where: v })
  }
}
...