簡體   English   中英

基於參數的動態返回類型 function

[英]Dynamic return type based on parameter to function

我對 Typescript 很陌生,我被卡住了,我試圖了解這是否可能。

我的目標是能夠使用名為“fields”的特定選項屬性調用我的 function“getRecords”,我在其中輸入要從服務器獲取的字段,並且我希望 typescript 建議我用於輸入的字段名被退回的 object。

我一直在嘗試使用單個字段作為輸入來執行此操作,但我的最終目標是使用帶有字段名稱的數組。

這是一個示例代碼,我還創建了一個 typescript 操場

const getRecords = async (options: { fields: string }): Promise<{ result: { [options.fields]: string}[] } | undefined> => {
    return await new Promise((resolve, reject) => {
        //Fetch Something here
        resolve({
            result: [
                { name: 'Test Name' }
            ]
        })
        reject(undefined)
    })
}

const test = async () => {
    let data = await getRecords({
        fields: 'name'
    })

    console.log(data)
}

test()

我讓它工作的唯一一次是當我像這樣對返回的 promise 中的密鑰進行硬編碼時:

Promise<{ result: { ['name']: string}[] } | undefined>

非常感謝任何幫助

謝謝!

這樣的事情會做我認為你所追求的:

const makeKeys = <T extends string>(fields: T[]): Record<T, string> => {
    // Sample implementation

    const map: Record<T, string> = {} as Record<T, string>
    for (const field of fields) {
        map[field] = 'test value';
    }

    return map;
}

const obj = makeKeys(['test', 'thing']);

// These fields can now be safely accessed with autocomplete :)
obj.thing // string
obj.test  // string

這里的關鍵是我們指定將字符串數組傳遞給 function

<T extends string>(fields: T[])

並且 function 將返回一個Record 類型,其鍵與數組中包含的字符串完全相同

Record<T, string>

一旦 TS 知道類型系統可以推斷出您傳遞到輸入數組中的任何字符串將是 output object 的鍵。

// These fields can now be safely accessed with autocomplete :)
obj.thing // string
obj.test  // string

暫無
暫無

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

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