[英]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.