Я пишу небольшую модель для моего текущего проекта. Я бы хотел, чтобы потребитель библиотеки мог предоставить свое собственное определение модели API. API должен выводить экземпляры модели пользователя при запросе сервера.Создайте родовую фабрику в машинописном тексте (Unsolved)
// Library Code
interface InstanceConstructor<T extends BaseModel> {
new(): T;
}
class Factory<T extends BaseModel> {
constructor(private cls: InstanceConstructor<T>) {}
get() {
return new this.cls();
}
}
class BaseModel {
refresh() {
// Refresh returns a new instance, but it should be of
// type Model, not BaseModel.
}
}
// User Code
class Model extends BaseModel {
// Custom Model
do() {
return true;
}
}
Не могу понять, как закончить рисунок здесь. Просто заставить фабрику выплюнуть правильные экземпляры довольно легко, однако такие вещи, как clone
/refresh
на BaseModel
, также должны вернуть Model
, а не any
.
Обновлено 10/2
После попытки машинописный @ следующий (технически 1,8-разработчика в данный момент), я, кажется, чтобы быть в состоянии обойти вопрос, где модель может ссылаться на себя (this
) и тип система может следовать за ней. Тем не менее, я не могу
// Library Code
export interface InstanceConstructor<T extends BaseModel> {
new(fac: Factory<T>): T;
}
export class Factory<T extends BaseModel> {
constructor(private cls: InstanceConstructor<T>) {}
get() {
return new this.cls(this);
}
}
export class BaseModel {
constructor(private fac: Factory<this>) {}
refresh() {
// get returns a new instance, but it should be of
// type Model, not BaseModel.
return this.fac.get();
}
}
// User Code, Custom Model
export class Model extends BaseModel {
do() {
return true;
}
}
// Kinda sucks that Factory cannot infer the "Model" type
let f = new Factory<Model>(Model);
let a = f.get();
let b = a.refresh();
Я открыл вопрос о машинописи трекера здесь: https://github.com/Microsoft/TypeScript/issues/5493
Обновлено 12/1 (неразрешенных)
Это, в соответствии с машинописный вопрос, невозможен. Функция «Полиморфный this
» работает только для нестатических членов класса, которые исключают конструктор.
Ницца, теперь я знаю название того, что мне нужно! Я попробую это с TS @ next, спасибо за подсказку. – Xealot