【问题标题】:Typescript define type with function test打字稿用功能测试定义类型
【发布时间】: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


    【解决方案1】:

    您不能调用具有类型的函数。所以函数调用isDotStringRegExp(T, key) 是不可能的,因为Tkey 都是类型。

    如果您想使用点符号进行类型安全访问,请查看以下问题:https://stackoverflow.com/a/68412497/10857778

    【讨论】:

      【解决方案2】:

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

      Typescript Conditional Types Not Figuring Out Type

      【讨论】:

        猜你喜欢
        • 2019-04-10
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        • 2020-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多