打字稿用功能测试定义类型

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) 是不可能的,因为 Tkey 都是类型。

如果你想使用点符号进行类型安全的访问,请看这个问题:

如果您正在寻找如何使用 Mongo 执行此操作,请查看我的其他线程,特别是 playground 代码。

Typescript Conditional Types Not Figuring Out Type