簡體   English   中英

Typescript 用 function 測試定義類型

[英]Typescript define type with function test

我正在嘗試創建允許我只搜索特定事物的類型。

假設我有這個 model 和數據:

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'});

所以我創建了這個類型來捕獲不在我的 model 中的錯誤:

export declare type MongoManagerFilter<T> = {
    [P in keyof T]?: T[P];
};

Mongodb 還允許您在 object 中進行搜索,例如:

db.users.findOne({'party.invites': 18});

如您所見,現在我使用的是以前的類型MongoManagerFilter ,我收到一個錯誤,即UserModel中不存在'party.invites'

所以我想做的是像這樣運行 function :

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 function。

我如何實現這一目標?

您不能使用類型調用 function。 所以 function 調用isDotStringRegExp(T, key)是不可能的,因為Tkey都是類型。

如果您想使用點符號進行類型安全訪問,請查看以下問題: https://stackoverflow.com/a/68412497/10857778

如果您正在尋找如何使用 Mongo 執行此操作,請查看我的另一個線程,特別是操場代碼。

Typescript 條件類型未確定類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM