我正在帮助一个使用MongoDB来持久化数据的 typescript 应用程序。我们正在尝试做的事情之一是摆脱any
的使用。
下面的代码用于定义mongoose模式的一部分:
priceMax: {
max: 10000000,
min: 0,
required: function (this: FeePricing & Document) {
return this.priceMin === undefined;
},
type: Number,
validate: [
{
message: 'Max price cannot be lower than min price',
validator: function (v: number) {
if ((this as any).priceMax === null || (this as any).priceMax === undefined) return true;
return (this as any).priceMin ? v >= (this as any).priceMin : v >= 0;
},
},
{
message: 'Max price cannot be higher than 50000 for this feeType',
validator: function (v: number) {
return !(!feeTypesWithoutMaxLimit.includes((this as any).feeType) && v > 50000);
},
},
],
},
priceMin: {
max: 10000000,
min: 0,
required: function () {
return (this as any).priceMax === undefined;
},
type: Number,
validate: {
message: 'priceMin cannot be higher than priceMax',
validator: function (v: number) {
return (this as any).priceMax ? v <= (this as any).priceMax : v >= 0;
},
},
},
updatedAt: { type: Date },
updatedBy: { type: String },
我大概知道函数在做什么,但是这里的类型让我很困惑。
我怎么才能摆脱this as any
?为什么不只是使用FeePricing
的类型-例如(this as FeePricing)
?FeePricing
似乎是只是另一个类型从我的应用程序[,其中priceMin
和priceMax
]与Document
接口相结合。ReactJS的Document
在这里有什么帮助?为什么需要它?validate
中的this
是否为上面定义的类型FeePricing & Document
?
谢谢
2条答案
按热度按时间qojgxg4l1#
this
是验证配置的上下文。由于TypeScript无法推断其类型(因为它可以更改为任何类型),我建议您创建自己的自定义类型,如FeePricing
。我不太确定您当前的FeePricing
包含哪些属性,因为它没有包含在示例中,但我会将其设置为如下:然后,您可以像这样使用它:
为什么属性是可选的,也是
null
,因为我可以看到你的一些逻辑检查他们是undefined
还是null
,因此这些类型将反映他们可能不存在于运行时,并帮助您正确验证。此外,如果FeePricing
类型用于其他东西,你当然可以改变这个类型名称为其他东西。要回答您关于ReactJs
Document
的问题,它没有添加任何帮助来推断mongoose配置类型,并且确实可以删除。gcuhipw92#
据我所知,Mongoose中的模式是用来定义存储在MongoDB中的文档的,如果我是正确的,你可以创建一个Feeprising的模型/接口,并将其用作类型。
this
是自由定价对象。希望这能帮上忙