【问题标题】:Cannot call extension method on base class typescript无法在基类打字稿上调用扩展方法
【发布时间】:2017-09-13 13:33:15
【问题描述】:

所以我有一个名为 Report 的基类,然后我有另一个从 Report 扩展的名为 Datasheet 的类。

我已经为 Report 类编写了一个扩展,我希望能够在我有一个 Datasheet 对象时调用它。

简单示例:

类写在一个文件中

export class Report {
    id: number;
    name: string;
}

另一个类写在另一个文件中

export class Datasheet extends Report {
    description: string;
}

这里我为报表类写了一个简单的扩展,又在一个不同的文件中

import { Report } from './report';

export {};

declare module './report' {
    interface Report {
        hasName(): boolean;
    }
}

Report.prototype.hasName = function() {
    return this.name == null || this.name.length > 0;
};

所以现在我创建了一个新的数据表,我想调用扩展方法.hasName(),它在打字稿中编译得很好,但是当它被发送到浏览器时,我得到一个错误提示

m.hasName 不是函数

例如,我会这样做(简单示例)

const m = new Datasheet();
const check = m.hasName();

为什么我得到一个错误,当它编译正常时?我正在使用 Typescript 2.4.2。

我正在尝试编写它,就像您可以编写 C# 对象一样,并编写扩展方法。这让我的物品保持整洁

任何帮助将不胜感激!

【问题讨论】:

  • 有没有理由不直接将hasName() 方法添加到Report 类中?
  • 当我将所有内容放在一个文件中而不导入或声明模块时,有问题的代码对我有用。扩展方法的真名是什么 - hasNamehasDescription?对Report.prototype.hasName 的赋值是否在调用new Datasheet() 之前在浏览器中执行?
  • 在您使用它们的文件中,您是否导入了模块扩展名?我试过了,在节点上它对我有用(在声明中将 hasDescription 更改为 hasName,假设这是一个错字)
  • 是什么导致扩展模块被加载?
  • 不知道为什么,但我首先在对象上执行此操作const report = Object.assign(new Report(), this.report);return report.hasName();

标签: javascript html typescript web typescript2.0


【解决方案1】:

您不需要 Typescript 中的 prototype 语法,编译器会为您创建它。最好你也不需要Object.assign,尤其是当问题可以通过类语法来解决时。

这显示了您如何拥有一个扩展ReportDatasheet,以便您可以调用hasName()

interface IReport { 
    hasName():boolean
}

class Report implements IReport {
    id: number
    name: string
    hasName() { 
      return this.name == null || this.name.length > 0; 
    }
}

class Datasheet extends Report {
    description: string
}

const m = new Datasheet();
const check = m.hasName(); 

【讨论】:

  • 但我不想直接针对我的对象创建函数
  • 你不会的。如果您编译我的答案,您会看到 javascript 与您在帖子中写的相同:Report.prototype.hasName = function () { return this.name == null || this.name.length > 0; };
  • 但是您已经直接针对Report 对象声明了hasName() 方法......
  • 是的,但是您的代码也这样做...如果您不希望 hasName 成为 Report 的方法,则必须从具有此功能的类扩展。报告扩展了 SomeClass。数据表扩展报告。但也许我不清楚你希望实现什么。
  • 正如我所写,我想要 2 个对象,但我希望在其他地方定义方法而不是针对对象定义,就像拥有一个 c# 对象并在其他地方编写扩展方法一样。这让我的对象保持整洁,就像 DTO 对象一样
猜你喜欢
  • 2020-07-07
  • 2019-06-27
  • 2017-04-02
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
相关资源
最近更新 更多