【发布时间】:2022-01-11 05:58:32
【问题描述】:
我正在尝试创建只允许我搜索特定事物的类型。
假设我有这个模型和数据:
interface UserModel {
_id: string;
username: string;
party: UserPartyModel;
}
interface UserPartyModel {
invites: number;
rsvps: number;
}
//Test Data
{
_id: '123',
username: 'testuser',
party: {
invites: 18,
rsvps: 3
}
}
使用 mongodb,我可以查询根属性:
db.users.findOne({_id: '123'});
db.users.findOne({username: 'testuser'});
所以我创建了这个类型来捕获模型中不存在的错误:
export declare type MongoManagerFilter<T> = {
[P in keyof T]?: T[P];
};
Mongodb 还允许您在对象内部进行搜索,例如:
db.users.findOne({'party.invites': 18});
如您所见,现在我使用的是以前的类型MongoManagerFilter,我收到一个错误,即'party.invites' 在UserModel 中不存在。
所以我想做的是像这样运行一个函数:
function isDotStringRegExp(obj: Object, dotKey: string): boolean {
let keyData = dotKey.split('.');
let objData = obj;
for (let i = 0; i < keyData.length; i++) {
let key = keyData[i];
if (objData.hasOwnProperty(key)) {
objData = objData[key];
if (i === keyData.length - 1) {
return true;
}
}
else {
return false;
}
}
}
然后添加另一种类型来执行此操作:
export declare type MongoManagerDotStringFilter<T> = {
[key: string]: (isDotStringRegExp(T, key) ? any : never);
};
很遗憾,它不允许我在这种类型中运行isDotStringRegExp 函数。
我如何做到这一点?
【问题讨论】:
标签: typescript mongodb typescript-typings typescript-generics