Невозможно использовать super для вызова унаследованной функции класса - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь вызвать функцию родительского класса от дочернего, но ключевое слово super вызывает и ошибка. Я использую машинопись, вот фрагмент package.json из проекта.

{
  "scripts": {
    "build": "tsc",
    "start": "nodemon",
    "prod": "npm run build && npm run start"
  },
  "dependencies": {
    "body-parser": "^1.18.3",
    "dotenv": "^6.1.0",
    "express": "^4.16.4"
  },
  "devDependencies": {
    "@types/body-parser": "^1.17.0",
    "@types/dotenv": "^4.0.3",
    "@types/express": "^4.16.0",
    "@types/node": "^10.12.2",
    "nodemon": "^1.18.5",
    "ts-node": "^7.0.1",
    "tslint": "^5.11.0",
    "typescript": "^3.1.6"
  }
}

Родительский класс

export default class baseController {

  public response = (message = "", status = 200) => (
    req: Request,
    res: Response
  ) => {
    return res.status(status).send({
      status: true, // true if success, false if faliure
      message: message, // message to display incase of error
      payload: []
    });
  };
}

Детский класс

import BaseController from "../baseController";

export default class UsersController extends BaseController {

  constructor() {
    super();
  }

  public fetchUsers = async () => {
    return super.response("testing");
  };
}

Код вылетает на линии return super.response("testing"); с ошибкой super keyword unexpected here.

Вот мой tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "noImplicitAny": true,
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "./dist",
    "pretty": true,
    "baseUrl": "./src",
    "alwaysStrict": true,
    "paths": {
      "*": ["node_modules/*", "src/types/*"]
    }
  },
  "include": ["src/**/*.ts"],
  "exclude": ["node_modules"]
}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Этот случай является одной из нескольких причин, почему методы-прототипы могут быть предпочтительнее, чем поля классов стрелки (методы экземпляра), как объяснено в этот ответ .

Здесь есть несколько проблем.

Одна проблема в том, что нет super.response. super относится к прототипу родительского класса, а response - это метод экземпляра.

Другая проблема заключается в том, что целью является ES6. async передается генераторам, а super не передается, что приводит к неправильному коду:

fetchUsers.a = () => __awaiter(this, void 0, void 0, function* () { return super.response("testing") });

Только функции со стрелками могут получить super из родительской области, super не допускается внутри функций без стрелок. Поскольку генераторов стрелок нет, super использование недопустимо внутри генератора. В то время как TypeScript способен правильно обрабатывать super в async прототипе методами:

fetchUsers() {
    const _super = name => super[name];
    return __awaiter(this, void 0, void 0, function* () { _super.response("testing").call(this); });
}

Еще одна проблема заключается в том, что ссылка на super в классе, который не переопределяет response, является семантической ошибкой. Дочерний класс уже наследует response. Может использоваться как this метод.

Должно быть:

export default class baseController {
  public response(message = "", status = 200) (...) { ... }
}

export default class UsersController extends BaseController {
  public async fetchUsers() {
    return this.response("testing");
  };
}

Если ожидается, что fetchUsers будет использоваться в качестве обратного вызова (это единственное использование для методов со стрелками), его следует связать с контекстом this с bind в конструкторе.

0 голосов
/ 04 ноября 2018

Ваша проблема в том, как вы создаете функции класса. Должно быть так:

export class baseController {

    public response(message = "", status = 200) { 

    }
}


export class UsersController extends baseController {

  constructor() {
    super();
  }

  public async fetchUsers() {
    return super.response("testing");
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...