打字稿用功能测试定义类型
Typescript define type with function test
我正在尝试创建允许我只搜索特定内容的类型。
假设我有这个模型和数据:
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
函数。
如何实现?
您不能调用带有类型的函数。所以函数调用 isDotStringRegExp(T, key)
是不可能的,因为 T
和 key
都是类型。
如果你想使用点符号进行类型安全的访问,请看这个问题:
如果您正在寻找如何使用 Mongo 执行此操作,请查看我的其他线程,特别是 playground 代码。
Typescript Conditional Types Not Figuring Out Type
我正在尝试创建允许我只搜索特定内容的类型。
假设我有这个模型和数据:
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
函数。
如何实现?
您不能调用带有类型的函数。所以函数调用 isDotStringRegExp(T, key)
是不可能的,因为 T
和 key
都是类型。
如果你想使用点符号进行类型安全的访问,请看这个问题:
如果您正在寻找如何使用 Mongo 执行此操作,请查看我的其他线程,特别是 playground 代码。
Typescript Conditional Types Not Figuring Out Type