中午后的大部分时间,我一直在试图弄清楚如何做到这一点,但我要么没有得到任何东西,要么我正在处理错误的事情。
我目前正在开发一个项目,我需要覆盖一个我已经拥有 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 从头开始重新编写了整个东西。