Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用typescript在第三方类上定义方法?_Javascript_Typescript - Fatal编程技术网

Javascript 如何使用typescript在第三方类上定义方法?

Javascript 如何使用typescript在第三方类上定义方法?,javascript,typescript,Javascript,Typescript,我试图扩展一个第三方类,但在让typescript发挥良好效果方面遇到了困难。基本上,我不能在我的新方法中使用类中已经定义的任何现有方法 一个解决方法是在extensions.ts中重新定义现有方法(见下文),但必须有更好的方法 第三方index.d.ts Myextensions.ts 调用现有方法(如上面的this.originalExistingMethod())时,typescript会抱怨: TS2339:类型“SomeClass”上不存在属性“originalExistingMeth

我试图扩展一个第三方类,但在让typescript发挥良好效果方面遇到了困难。基本上,我不能在我的新方法中使用类中已经定义的任何现有方法

一个解决方法是在
extensions.ts
中重新定义现有方法(见下文),但必须有更好的方法

第三方
index.d.ts
My
extensions.ts
调用现有方法(如上面的
this.originalExistingMethod()
)时,typescript会抱怨:

TS2339:类型“SomeClass”上不存在属性“originalExistingMethod”

有没有办法避免在执行时重新定义现有方法?

初始答案 下面是使用Tensorflow库的示例

扩展

import { AdadeltaOptimizer } from '@tensorflow/tfjs-core';

declare module '@tensorflow/tfjs-core' {
    interface AdadeltaOptimizer {
        newMethod(message: string): void;
    }
}

AdadeltaOptimizer.prototype.newMethod = function (message: string) {
    console.log('===============');
    console.log(message);
    console.log('===============');
}
索引

import { AdadeltaOptimizer } from '@tensorflow/tfjs';
import "./extend";

const optimizer = new AdadeltaOptimizer(10, 10);

// the existing method is present
const className = optimizer.getClassName();

// the augmentation is also present
optimizer.newMethod(`The className is ${className}.`);
还有一个类似的例子,它使用
map
方法来增强
Observable

意见的后续行动
谢谢。虽然我的问题是在定义newMethod时使用现有方法。所以在extend.ts中,而不是index.ts中。有什么想法吗

这也适用于
extend.ts
,如下所示:

import { AdadeltaOptimizer } from '@tensorflow/tfjs-core';

declare module '@tensorflow/tfjs-core' {
    interface AdadeltaOptimizer {
        newMethod(message: string): void;
    }
}

AdadeltaOptimizer.prototype.newMethod = function (message: string) {

    // just access the original method on `this` 
    const className = this.getClassName();

    console.log('===============');
    console.log(className);
    console.log(message);
    console.log('===============');
}

真正的问题是:为什么要修改第三方类?温和地说,这是一种不好的做法。因为这是一种不好的做法,你将很难找到好的/正确的解决方案。谢谢。尽管我的问题是在定义
newMethod
时使用现有方法。因此,在
extend.ts
中,而不是在
index.ts
中。有什么想法吗?那也一样。我会发布一个更新。谢谢你的例子回购肖恩!我克隆了它,但它仍然不起作用,但是。。。。事实证明,在塞恩的储藏室里有什么东西才是真正的罪魁祸首!通过使用
npm install
安装模块进行验证。为了解决Thread的问题,我运行了
Thread cache clean&&Thread install
,没有更多的ts错误!我很高兴听到这一切最终得以实现。很好地抓住了纱线。
import { AdadeltaOptimizer } from '@tensorflow/tfjs';
import "./extend";

const optimizer = new AdadeltaOptimizer(10, 10);

// the existing method is present
const className = optimizer.getClassName();

// the augmentation is also present
optimizer.newMethod(`The className is ${className}.`);
import { AdadeltaOptimizer } from '@tensorflow/tfjs-core';

declare module '@tensorflow/tfjs-core' {
    interface AdadeltaOptimizer {
        newMethod(message: string): void;
    }
}

AdadeltaOptimizer.prototype.newMethod = function (message: string) {

    // just access the original method on `this` 
    const className = this.getClassName();

    console.log('===============');
    console.log(className);
    console.log(message);
    console.log('===============');
}