2015-10-30 2 views
2

Я пишу небольшую модель для моего текущего проекта. Я бы хотел, чтобы потребитель библиотеки мог предоставить свое собственное определение модели 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» работает только для нестатических членов класса, которые исключают конструктор.

ответ

2

Вам нужно использовать специальный this тип:

class BaseModel { 
    refresh(): this { 
     // Refresh returns a new instance, but it should be of 
     // type Model, not BaseModel. 
    } 
} 

На момент написания, эта функция доступна только в ночных сборках машинопись (npm install [email protected]), и будет доступен в машинописном 1.7 , См. https://github.com/Microsoft/TypeScript/pull/4910, если вы хотите отслеживать конкретную фиксацию или узнать больше о том, как работают this

+0

Ницца, теперь я знаю название того, что мне нужно! Я попробую это с TS @ next, спасибо за подсказку. – Xealot

Смежные вопросы