TS - Невозможно вызвать публичный метод в super () из дочерних - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть два класса.Одним из них является родительский класс Model.Другой это его дети, так что:

import { IModel } from '../shared'

export default class DataModel implements IModel {

  private data: {[key: string]: any} = {}

  public constructor(data: {[key: string]: any}) {
    this.data = data
  }

  // ... other methods

  public forRequest = (params?: {[key: string]: any}): object => {
    return {
      ...this.data,
      ...params
    }
  }
}

и

import { IModel } from '../shared'
import DataModel from './_'

export default class LoginModel extends DataModel implements IModel {

  constructor() {
    super({
      email: 'info@email.com',
      password: 'test1234'
    })
  }

  public forRequest = (): object => {
    return super.forRequest({
      sso: true
    })
  }
}

и:

export interface IModel {
  forRequest(params?: {[key: string]: any}): object
  ...
}

По https://www.typescriptlang.org/docs/handbook/classes.html и пример с животнымиЯ хотел бы вызвать мой метод forRequest(), передав параметры родительскому классу.

Однако, когда я звоню super.forRequest(...) Я получаю сообщение об ошибке: Доступны только публичные и защищенные методы базового класса через ключевое слово 'super' .ts (2340) .

(У меня нет проблем с перегрузкой метода forRequest () в родительском классе, если это может быть решением, если необходимо, но не уверен, что это хорошая идея).(в IModel Я пробовал обоими способами, с параметрами и без)

Мне интересно, что здесь отличается от примера с сайта TS, и почему код не работает.

Любая помощь приветствуется.Спасибо.

1 Ответ

0 голосов
/ 25 декабря 2018

Разница здесь в том, как вы объявляете вашу forRequest функцию.

Вы назначаете функцию в качестве значения свойства forRequest, а не присваиваете ее прототипу.

У вас есть доступ только к super в дочерних методах.

У вас должен быть доступ, если вы сделали это вместо этого.

class DataModel {

  private data: {[key: string]: any} = {}

  public constructor(data: {[key: string]: any}) {
    this.data = data
  }

  // ... other methods

  public forRequest(params?: {[key: string]: any}): object {
    return {
      ...this.data,
      ...params
    }
  }
}

class LoginModel extends DataModel {

  constructor() {
    super({
      email: 'info@email.com',
      password: 'test1234'
    })
  }

  public forRequest(): object {
    return super.forRequest({
      sso: true
    })
  }
}

Посмотрите, что он компилирует в здесь

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