ES6或typescript中Date类的继承问题

关于在es6中如何继承Date类的问题

在ES6标准入门中,明确有说可以ES6中可以继承原生构造函数,如Array,Date等,但是只举了Array的例子。
最近在项目中遇到了很多时间操作,所以想自定义一个继承自Date的类,添加一些方便的方法

class MyDate extends Date {
    constructor() {
        super();
    }
    ......
}
let foo = new MyDate();
console.log(foo.getDate());

这个时候就报错了,说getDate方法只能用于Date对象,对这个结果表示不理解。
在typescript中也会发生同样的错误
谷歌上有搜到说,在typescript中,是不允许对原生构造函数进行继承的,所以如果想添加什么自定义方法,只能使用interface,这就有点矛盾了。。。
所以想请教一下各位大佬,如果想使用extends Date的方法定义一个MyDate,既能实现自定义的方法,又能保证原生方法的实现,正确的写法应该是什么样的

阅读 5.8k
3 个回答

那就不用继承咯,用复合。

class MyDate {
  private date: Date;

  constructor (...args) {
    this.date = new Date();
  }

  getDate () {
    return this.date.getDate() + ' MyDate';
  }
}

clipboard.png
试了一下 没有出现楼主的问题

虽然隔了很久,但还是觉得有必要冒泡回答下。

1.首先,题主的要求:想使用extends Date的方法定义一个MyDate,既能实现自定义的方法,又能保证原生方法的实现。 这完全是可以实现的(不考虑复合,纯继承法也可以实现)。参考下文链接

如何继承Date对象?由一道题彻底弄懂JS继承。

上文中提到了如何继承Date,包括ES6和ES5的不同写法

2.然后再顺便提下题主的描述。题主说ES6继承Date报错?我觉得题主的描述是不是有误(或者不全)。

应该是这样的吧?用ES6的写法继承Date,然后通过Babel打包出来,运行出错。这样描述才是合理的。

因为ES6本身确实是可以继承Date的,但是Babel打包出来后就成了es5或者更老的写法了,自然无法继承。(当然了,es5也有黑魔法可以继承Date,可以参考上面链接中的文章)

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