#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 ? [{}] : {}
}
}