Абстрактный внутренний класс в машинописи - PullRequest
0 голосов
/ 04 марта 2019
abstract class Model {
    abstract class View extends ModelView<this>;

    getView(){
        return new View();
    }
}

abtract class ModelView<M extends Model> {}

class Shape extends Model {
    View = class {
        constructor(){ console.log("view created"); }
    }
}

Я пытаюсь создать подобный код, который, как мне кажется, хорошо структурирован.

Возможно ли в рамках реакции иметь класс в качестве подклассадругое - и иметь его как абстрактное свойство (желательно статическое).

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Вы просто ищете что-то вроде следующего?

abstract class Model {

  // don't use "class" here; the type of a constructor has new(...) in it:
  abstract View: new () => ModelView<this>;

  getView() {
    return new this.View(); // View is an instance property, need "this"
  }
}

abstract class ModelView<M extends Model> { }

class Shape extends Model {
    View = class {
        constructor(){ console.log("view created"); }
    }
}

Если это отвечает вашим потребностям, отлично.Если нет, пожалуйста, отредактируйте свой вопрос, чтобы включить больше информации о вашем случае использования.Надеюсь, это поможет вам.Удачи!

0 голосов
/ 04 марта 2019

Я думаю, что получил это.

В синтаксисе TS, как это attribute: Item { ... означает, что attribute является экземпляром класса Item.Если вы хотите, чтобы attribute был классом Item (не экземпляром), вы должны использовать синтаксис, подобный этому attribute: { new (...args): Item } {....Итоговый код должен выглядеть следующим образом:

abstract class ModelView<M extends Model> {}


abstract class Model {
    public View: { new(...args): ModelView<Model> };

    getView(): ModelView<Model> {
        return new this.View();
    }
}

, а затем в классе Shape вы можете сделать это:

class Shape extends Model {
    View = class {
        constructor(){ console.log("view created"); }
    }
}

И код будет безопасным для типа.

Детская площадка

------ Отредактировано ------

Если вы хотите, чтобы View был статичным и доступен только для чтения, вам нужно немного изменить getViewреализация к этому:

public static readonly View: { new(...args): ModelView<Model> };

getView(): ModelView<Model> {
    return new Model.View();
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...