4

中午后的大部分时间,我一直在试图弄清楚如何做到这一点,但我要么没有得到任何东西,要么我正在处理错误的事情。

我目前正在开发一个项目,我需要覆盖一个我已经拥有 JS 文件的现有 Javascript 对象。

第 3 方库有一个形状基类,它是一个作为自执行函数创建的 JS 类。

在库中,有许多从这个类派生的形状,在底层看起来像是使用典型的调用/应用路由来扩展形状基类。

在我的代码中,我必须这样做来扩展其中一个形状(我们称之为 simpleshape),以实现我自己的自定义形状和它的绘图代码。

function MyCustomShape() {
  simpleShape.call(this);
};

shapeUtils.extend(MyCustomShape, simpleShape);

MyCustomShape.prototype.redraw = function (param1, param2) {
  // my custom implementation here
};

“shapeUtils.extend”是扩展类的形状库中的一个函数,我不知道它到底做了什么,而且它被严重混淆了。然而,我最终得到的是一个“MyCustomShape”类,它实现了 simpleShape 类及其属性等,如您所见,我只需简单地覆盖重绘函数,图形库也会在需要时调用它。

这一切在普通的旧javascript中都可以正常工作,但是我正在使用TypeScript,目前为了让它工作,我已经将它内联在要使用它的TS类中的嵌入式JS函数中。

就像是:

class myTsClass {

  // constructor

  // private properties, functions etc

  private pointerToMyCustomShape: Function;

  private createMyCustomShape(){

    this.pointerToMyCustomShape = function MyCustomShape() {
      simpleShape.call(this);
    };

    shapeUtils.extend(MyCustomShape, simpleShape);

    MyCustomShape.prototype.redraw = function (param1, param2) {
      // my custom implementation here
    };

  }

  private someThingThatUsesTheShapeLibrary()
  {
    this.createMyCustomShape();


    // do stuff that uses the custom shape

  }

}

问题是,我现在需要将一些新的属性和函数添加到现在属于继承类的覆盖中,并且因为这些属性在任何类型的 Typescript 定义中都不存在,所以 typescript 拒绝构建项目。

例如:

  private createMyCustomShape(){

    this.pointerToMyCustomShape = function MyCustomShape() {
      simpleShape.call(this);
    };

    shapeUtils.extend(MyCustomShape, simpleShape);

    MyCustomShape.prototype.redraw = function (param1, param2) {
      // my custom implementation here
    };

    MyCustomShape.prototype.myCustomFunction = function (param1, param2) {
      // my custom function implementation here
    };

  }

但后来尝试做

this.pointerToMyCustomShape.myCustomFunction();

导致 Typescript 抛出一个 wobbler,因为“Function”不包含“myCustomFunction”的定义。

我当然可以将类型更改为“any”,但是浏览器中的 javascript 引擎会抛出一个 wobbler,因为它需要“simpleShape”而“simpleShape”没有“myCustomFunction”的定义

因此,我的下一个攻击计划是创建一个直接在 typescript 中实现“myCustomShape”的类,例如:

class MyCustomShape {

  private redraw(param1: type, param2: type)
  {
    // Implementation here
  }

  private MyCustomFunction(param1: type, param2: type)
  {
    // Implementation here
  }

}

思考是因为我的 3rd 方库有一些有限的 D.TS 定义

(有限,因为我自己创建了它们,还没有转换整个库,只是我正在使用的位)

我应该能够做到

class MyCustomShape extends simpleShapeStatic {

  private redraw(param1: type, param2: type)
  {
    // Implementation here
  }

  private MyCustomFunction(param1: type, param2: type)
  {
    // Implementation here
  }

}

“simpleShape”在哪里

interface simpleShapeStatic {

  // Properties and functions as implemented in simpleshape
  // according to the docs, here

}

但可惜我发现,我不能那样做。

在 D.TS 中,iv'e 创建了如下存根:

interface simpleShapeStatic {

  // Properties and functions as implemented in simpleshape
  // according to the docs, here

}

declare var simpleShape: simpleShapeStatic

所以我想我可能已经能够使用

class MyCustomShape extends simpleShape {

  private redraw(param1: type, param2: type)
  {
    // Implementation here
  }

  private MyCustomFunction(param1: type, param2: type)
  {
    // Implementation here
  }

}

但看来我也不能这样做。

更复杂的是,我使用 AMD 模块完成所有这些工作,在 requireJS 下按需加载,所以我派生的任何类都需要能够使用

import customShape = require("myCustomShape");

目前,我只是在兜圈子,所以我怎样才能在我的 JS 库中扩展对象,使用 Typescript,然后向它们添加我自己的自定义,然后通过导入机制在不同的 typescript 类中使用它们。

干杯肖蒂

更新 - 25/8/2017

对于任何在谷歌搜索中找到这个的人。我从来没有找到这个问题的答案。

SO中没有人提出任何线索,在我当时参与的项目中,我从来没有找到一种方法来做到这一点。

差不多一年后,我不再从事这个项目,在离开之前,因为我没有找到解决方案,我删除了与这个 Q 相关的所有代码,只是用 TypeScript 从头开始​​重新编写了整个东西。

4

0 回答 0