typescript中如何扩展js某个原型对象的方法?

例如:在js文件中写Object.prototype.dosth=function(){},

如何在typescript中使用这个dosth方法,或者直接在ts中就可以扩展?

阅读 18.7k
8 个回答

无论TS还是JS, 一般情况都不推荐扩展原生对象的原型方法。

只有在为了兼容新标准的 API 才被允许扩展。

但是在TS上做到兼容新标准的 API 很容易,
只需要将tsconfig.json中的"target"设置为"es2015", "es2016""es2017"就可以。

强行这么写是可以的,虽然TS会报错但是其实可以执行。
不过TS中不应该这么做,TS的目的就是一定程度上实现强类型,做法应该是像C#、Java中那样使用继承:

class Parent {
  public SayHi() {
    console.log('hi');
  }
}
class Child extends Parent {
  public SayNo() {
    console.log('no');
  }
}
new Child().SayHi(); // call method from Parent

typescript定义文件global.d.ts

interface Object {
  dodo(): any;
}

测试代码a.ts

const a = 'a';
a.dodo();

完美通过编译

比如我想扩展Array的原型方法,我应该怎么做?

写个类继承Array,在这个类上添加你要的方法,不要直接在内置类上进行扩展。

var obj =new obj();
obj.protoperty.play=function(){
alert("haha!");
}
obj.play();
不谢

如果不是为了兼容,最好都不要扩展。用好extend和implements可以省下很多代码。
之前开发angular4项目,页面相关创建一个BasePage类提供共用的方法,provider相关也有一个BaseProvider。
至于在原生扩展,目前没有遇到必须要这样用的场景

内置的lib声明了Object 的类型,所以你这样写找不到该方法编译就会报错。
ts提供了类型断言解决这个问题:

      (Object as any).prototype.dosth= function () {
        
        };

这个情景下,你断言成any了,所以就不会报错了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题