我有一个返回这样的对象的数据库:
interface Bicycle {
id: string;
created_at: string;
}
我知道
created_at
拥有一个机器友好的日期,我需要将其转换为 Date 对象以进行本地化:new Date(bike.created_at)
。
我不想将
created_at
定义为普通字符串,而是将其定义为扩展字符串的类型,并使用我可以调用的方法将其转换为日期:bike.created_at.toDate()
。
这将提供一种简单、类型安全的方法,从这些保存日期的字符串中获取 Date 对象,正如数据库所保证的那样。
实现可能如下所示:
interface DateString extends string {
toDate(): Date;
}
interface Bicycle {
id: string;
created_at: DateString;
}
但是,除非我将字符串原型突变为“猴子补丁”我的
toDate
实现,否则这将不起作用。我知道改变原型是不好的做法,因为它可能会导致不可预测的行为。我也不想让 toDate
可用于我的应用程序中非日期的所有其他字符串。
我可以编写一个转换器,从数据库中获取对象并用日期替换
created_at
字符串。但这似乎比我尝试的示例更脆弱,其中 created_at
是标记为具有特殊日期用途的字符串。
虽然不建议这样做,但您可以使用
String.prototype
方法扩展 toDate
。然后,只需 declare global { … }
即可“发布”字符串类型的更改。