【发布时间】:2021-01-19 16:51:30
【问题描述】:
如何正确定义 Date 子类的构造函数(打字稿 4.1.3)?
Date对象的构造函数定义是这样的:
new(): Date;
new(value: number | string): Date;
new(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date;
在我的代码中,我尝试指定:
class MyDate extends Date {
// overloads copied from DateConstructor
constructor();
constructor(value: number | string);
constructor(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number);
// constructor impl
constructor(
yearOrValue?: number | string, month?: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number
) {
super(yearOrValue, month, date, hours, minutes, seconds, ms);
/* ^^^^^^^^^^^
Argument of type 'string | number | undefined' is not assignable to parameter of type 'number'.
Type 'undefined' is not assignable to type 'number'.(2345)
*/
}
}
但这会导致超级调用中的编译错误:
Argument of type 'string | number | undefined' is not assignable to parameter of type 'number'.
Type 'undefined' is not assignable to type 'number'.(2345)
如何定义构造函数参数,以便我可以在原始 Date 对象具有的所有可能性下调用 super 并保持类型安全(尽可能)?
注意事项:
- 这里是typescript playground example 的链接
- 这只是一些测试代码,在生产版本中我在构造函数中有更多代码
- 我想要一个适用于类的解决方案(即不会弄乱原型等)
【问题讨论】:
-
搞砸了:
@ts-ignore constructor(...args) { super(...args) }. -
@Bergi - 是的。这也是一个非常合理的选择。
标签: javascript typescript datetime constructor-overloading