我試圖能夠構建一個函式/方法來從陣列構建一個選項。例如,我正在使用 Mikro-ORM,并且有一個型別呼叫FindOptions<T>可以填充我的資料庫排序順序請求。
FindOptions 介面定義為:
export interface FindOptions<T, P extends string = never> {
populate?: readonly AutoPath<T, P>[] | boolean;
orderBy?: (QueryOrderMap<T> & {
0?: never;
}) | QueryOrderMap<T>[];
limit?: number;
offset?: number;
...
}
直接使用 FindOptions 時,我可以將我的 Entity 指定為泛型const MikroORMSoryBy: FindOptions<TimeEntryEntity>,用于代碼完成和編譯器提示等。
我可以通過以下方式構建我的排序:
const MikroORMSoryBy: FindOptions<TimeEntryEntity> = {
orderBy: { EntryDate: QueryOrder.ASC, Id: QueryOrder.ASC, UserId: QueryOrder.ASC }
};
我可以毫無問題地清楚地列出我的欄位。我什至可以將它們列為字串,這很有效。
orderBy: { 'EntryDate': QueryOrder.ASC, 'Id': QueryOrder.ASC, 'UserId': QueryOrder.ASC }
我的問題是,如何轉換它以便我可以使用代碼構建 orderBy?例如,我可以傳遞列名 ( ['EntryDate', 'Id', 'UserId']) 的 string[] 并使用 forEach 或其他東西回圈遍歷它。
const Fields: Array<string> = ['EntryDate', 'Id', 'UserId'];
Fields.forEach( (OneField: string) => {
...
});
我不知道該怎么做,是構建 orderBy,從我的字串陣列構建,而不是硬編碼名稱。這將允許我構建一個用于構建排序選項的通用函式。
理想情況下,我想要類似的東西:
const Fields: Array<string> = ['EntryDate', 'Id', 'UserId'];
Fields.forEach( (OneField: string) => {
orderBy[OneField] = QueryOption.ASC; // ???
});
uj5u.com熱心網友回復:
我們將首先定義一個帶有兩個泛型引數的新函式:
function buildOrderBy<E, Fields extends (keyof E)[]>(fields: [...Fields]) => {
return fields.reduce((r, f) => ({ ...r, [f]: QueryOrder.ASC }), {} as { [K in Fields[number]]: QueryOrder });
}
簡單地說,我們獲取物體的鍵并構造映射到的鍵的物件QueryOrder.ASC。
但是,如果我們嘗試在這里呼叫它:
const orderByBuilder = buildOrderBy<MyEntity>([...]);
我們會得到一個錯誤,因為我們沒有提供Fields泛型引數。如果我們這樣做了,那么我們基本上只是將我們的輸入復制到了這個函式中,這很糟糕。這稱為部分型別推斷(或缺少部分型別推斷),解決它的一種方法是使用柯里化:
function buildOrderBy<E>() {
return <Fields extends (keyof E)[]>(fields: [...Fields]) => {
return fields.reduce((r, f) => ({ ...r, [f]: QueryOrder.ASC }), {} as { [K in Fields[number]]: QueryOrder });
};
}
現在我們可以這樣稱呼它:
const orderBy = buildOrderBy<MyEntity>()([...]);
這可能更有用,因為您可以存盤中間函式:
const orderBy = buildOrderBy<MyEntity>();
orderBy([...]); // use independently
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510453.html
標籤:打字稿仿制药
上一篇:為什么在這里缺少泛型型別引數?
