這似乎很基本,但我沒有找到答案。
我想呼叫這樣的函式:
const result = myFunction({
'keyA': [ 'arrayA1', 'arrayA2' ],
'keyB': [ 'arrayB1', 'arrayB2' ],
});
我希望結果是一個鍵/值記錄,其中鍵限制為keyAand keyB,并且值也是鍵/值記錄,鍵為arrayA1,arrayA2等:
result = {
keyA: {
arrayA1: 'example',
arrayA2: 'example',
},
keyB: {
arrayB1: 'example',
arrayB2: 'example',
}
}
我正在努力提出一個通用函式簽名,它將獲取引數中的鍵和陣列項并將它們轉換為嵌套物件鍵。
function myFunction<
T extends { [K in keyof T]: string[] },
S extends keyof T,
O extends T[K] // ???
//O extends { InstanceType<T[K]> } // nope
//O extends { [K in keyof T]: { [K2 in keyof T[K]]: K2 } } // very confused
>(structure: T): Record<S, Record<O, string>> { ... }
我似乎無法弄清楚如何提取嵌套字串陣列,并將其轉換為僅將這些值指定為允許字串的型別。我錯過了什么?
uj5u.com熱心網友回復:
您的函式只需要兩種通用型別:
function myFunction<
T extends Record<string, S[]>,
S extends string
>(structure: T): {
[K in keyof T]: {
[K2 in T[K][number]]: string
}
} { return null! }
T將保存傳遞的structure并被限制為具有字串鍵的物件,其中值為S-arrays。S被限制為string. 我們需要S在這里將陣列中 s 的型別縮小string為字串字面量。
回傳型別由兩個嵌套的映射型別組成。第一個映射到 的鍵,T而第二個映射到 中的元素T[K]。
const result = myFunction({
'keyA': [ 'arrayA1', 'arrayA2' ],
'keyB': [ 'arrayB1', 'arrayB2' ],
});
// const result: {
// keyA: {
// arrayA1: string;
// arrayA2: string;
// };
// keyB: {
// arrayB1: string;
// arrayB2: string;
// };
// }
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/516371.html
標籤:打字稿仿制药
