我试图从第三方类重写一个公共方法,但它没有调用重写方法。
方法签名是相同的,我什至使用了override关键字并设置了'noImplicitOverride'标志ts.config来确认我的方法实际上是覆盖了super的方法。但它仍然调用super的方法(位于node modules下的mjs文件中)而不是覆盖方法。
更多详细信息
我正在做一个Angular项目,我们正在使用Material DateTimePickers。我们最近用Luxon替换了Moment。Material提供了一个LuxonDateAdapter来使用Luxon及其DateTimePickers(@angular/material-luxon-adapter),但不幸的是,它不支持时间,只支持日期,所以我不得不为Luxon创建自己的DateTimeAdapter,名为MatLuxonDateTimeAdapter,它扩展了LuxonDateAdapter。然后,我手动添加了所有缺少的解析/格式化功能,以处理时间。
这一切都进行得很顺利,直到我意识到LuxonDateAdapter中的'parse'方法没有按照我们想要的方式运行。没问题,我只是重写该方法并调整它。不幸的是,这就是问题的开始。即使LuxonDateAdapter的parse方法是公共的,当我重写它时,它似乎完全忽略了我的override方法,而是调用super的。
在我的MatLuxonDatetimeAdapter类中
@Injectable()
export class MatLuxonDatetimeAdapter extends LuxonDateAdapter {
constructor(@Optional() @Inject(MAT_DATE_LOCALE) matDateLocale: string,
@Inject(MAT_LUXON_DATE_ADAPTER_OPTIONS) options: MatLuxonDateAdapterOptions) {
super(matDateLocale, options);
}
override parse(value: any, parseFormat: string | string[]): DateTime | null {
console.log('This isn't being called!)'
return null;
}
//... other methods which probably aren't relevant
}
在LuxonDateAdapter的类声明中
export declare class LuxonDateAdapter extends DateAdapter<DateTime> {
parse(value: any, parseFormat: string | string[]): DateTime | null;
//... other method declarations which probably aren't relevant
}
我不明白为什么它不调用我的重写方法。
1条答案
按热度按时间wvt8vs2t1#
解决了!
Material同时有一个DatetimeAdapter和一个DateAdapter。如果datepicker只使用日期,它使用DateAdapter。如果它同时使用日期和时间,它使用DatetimeAdapter。在我的模块中,我只提供了DatetimeAdapter实现。因为我的datepicker只使用日期,我的DatetimeAdapter类甚至没有被使用。