Typescript возвращает один или массив на основе значения счетчика

#typescript

Вопрос:

Мне нужна create функция для возврата одной модели или массива моделей на основе count значения.

 
export default abstract class Factory<Model> {
    protected _count: number = 1

    private count(count: number): this {
        this._count = count
        return this
    }

    public create(): Model | Model[] {
        return this.generate()
    }

}
 

но проблема в том, что клиентский код должен проверить, является ли результат массивом или нет, что нежелательно.

 // data is Model|Model[] but should be Model[]
const date = factory.count(2).create()

// data is Model|Model[] but should be Model
const date = factory.create()
 

Как я могу установить условие, чтобы create возвращаемый тип был массивом, если count > 1 ?

Ответ №1:

Единственный способ-выполнить статическую инициализацию count , чтобы тип возвращаемого значения можно было указать во время компиляции.

 export class Factory<Model> {

    count(): SingleFactory<Model>;
    count(n: number): ArrayFactory<Model>;
    count(n?: any): any {
      if (arguments.length) {
        return new ArrayFactory<Model>(n);
      }
      return new SingleFactory<Model>();
    }
}

export class SingleFactory<Model> extends Factory<Model> {
    constructor() { super() }
    public create(): Model {
      return {} as Model;
    }
}

export class ArrayFactory<Model> extends Factory<Model> {
    constructor(protected _count?: number) { super() }
    public create(): Model[] {
      return Array(this._count).fill(0).map(x => ({} as Model));
    }
}

const f = new Factory<Model>();
const f1 = f.count().create();
const f2 = f.count(2).create();
 

Было бы проще, если бы вы просто добавили count в качестве параметра create .

 export class Factory<Model> {
    public create(): Model;
    public create(n: number): Model[];
    public create(n?: number): any {
        return arguments.length ? [{}] : {}
    }
}