【问题标题】:TS - Cannot call a public method within super() from the childrenTS - 无法从子级调用 super() 中的公共方法
【发布时间】:2019-05-24 06:33:38
【问题描述】:

我有两节课。 一个是父模型类。另一个是它的孩子,所以:

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' keyword.ts(2340) 访问。

(如果这可能是一个解决方案,我可以在父类中重载 forRequest() 方法,如果有必要,但不确定这是否是个好主意)。 (在 IModel 中我尝试了两种方式,有参数和没有参数)

我想知道这里与 TS 网站上的示例有何不同,以及为什么代码不起作用。

任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: typescript oop inheritance


    【解决方案1】:

    这里的区别在于您声明 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
        })
      }
    }
    

    看看它编译成here

    【讨论】:

    • 谢谢!你说的对。关于箭头函数的用例和“正常”分配,这是非常重要的区别。完全忘记了!
    猜你喜欢
    • 2018-12-08
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多