首页 > 解决方案 > TS - 无法从子级调用 super() 内的公共方法

问题描述

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

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 站点的示例有什么不同,以及为什么代码不起作用。

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

标签: typescriptoopinheritance

解决方案


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

在这里查看它编译的内容


推荐阅读