【发布时间】:2021-12-24 09:48:03
【问题描述】:
我有这个类表示从 POST 请求传入的 JSON。
class MilkCarton {
company: string;
price: number;
expiredAt?: string;
// ...20 more properties
}
在我将它存储到我的mongoDB数据库之前,我想将expiredAt的类型更改为Date,所以我有另一个代表数据库架构的类。
class MilkCartonSchema: {
company: string;
price: number;
expiredAt?: Date;
// ...20 more properties
}
expiredAt 可以为空,我想创建一个对象,该对象复制MilkCarton 类型的对象,但将其expiredAt 转换为Date
prepareMilkForDb(milk: MilkCarton): MilkCartonSchema {
const preparedMilk = {
...milk,
}
if (milk.expiredAt) {
preparedMilk.expiredAt = new Date(milk.expiredAt)
}
return preparedMilk;
}
但是我遇到了一个错误,因为preparedMilk 已经推断出它的类型并且expiredAt 是string,如果它是string,从 TypeScript 的角度来看它不能变成Date。但我希望它变成Date,在 TypeScript 中正确执行此操作的方法是什么?
编辑: 我最终选择了:
prepareMilkForDb(milk: MilkCarton): MilkCartonSchema {
const preparedMilk = {
...milk,
...(milk.expiredAt && {
expiredAt: new Date(milk.expiredAt)
}),
}
return preparedMilk;
}
这行得通,但不是我想要的,如果我有另一个示例,其中包含 3 个不同的深层嵌套 ISO string 属性需要转换为 Date(和向后),这样做会很脏解决方法。
【问题讨论】:
-
类似
return { ...milk, expiredAt: new Date(milk.expiredAt) },但请注意字符串是可选的命中日期是必需的 - 你为未定义的输入输入什么日期? -
@jonrsharpe 我修复了它
date也应该是可选的。你建议的问题是我认为如果milk.expiredAt是undefined,new Date(milk.expiredAt)会抛出错误。 (如果相反它返回undefined它仍然不是我想要的,因为我不想将undefined存储在我的数据库中,而且我不确定我什至可以在mongoDB 中) -
所以从
const { expiredAt, ...preparedMilk } = milk开始。 -
@jonrsharpe 谢谢它确实以某种方式解决了它,如果我理解正确的话,按照你的建议我会做
if (milk.expiredAt) preparedMilk['expiredAt'] = milk.expiredAt因为我不能做preparedMilk.expiredAt = milk.expiredAt因为在破坏环之后@987654349 @ 没有属性expiredAt。仍然感觉有点“hacky”我希望有一个更好的打字稿解决方案不会试图绕过它,但仍然感谢它确实解决了我现在的问题我想不出更清洁的东西。
标签: javascript node.js typescript mongoose