所以我想要實作的是:我有一個型別P
,它代表一個物件的鍵陣列T
,所以P extends Array<keyof T>
。我想傳遞P
toOmit<T, P>
以從該物件中排除給定的鍵。
在 TS 代碼中它看起來像這樣
export function excludeProps<T extends Record<string, any>, P extends Array<keyof T>>(
object: T,
...propsToExclude: P
): Omit<T, P> {
const filteredEntries = Object.entries(object).filter(([key]) => !propsToExclude.includes(key));
return Object.fromEntries(filteredEntries);
}
這當然行不通,因為 Omit 需要一個鍵或鍵的聯合,而不是陣列。有沒有辦法轉換P
以便可以傳入?或者有沒有更好的方法來輸入這個?
uj5u.com熱心網友回復:
它非常簡單:通過索引將陣列的元素轉換為聯合型別[number]
。
export function excludeProps<
T extends Record<string, any>,
P extends Array<keyof T>
>(
object: T,
...propsToExclude: P
): Omit<T, P[number]> {
const filteredEntries = Object.entries(object).filter(([key]) => !propsToExclude.includes(key));
return Object.fromEntries(filteredEntries) as Omit<T, P[number]>
}
此外,您將需要回傳型別的型別斷言。
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/529962.html
標籤:打字稿打字稿泛型